﻿-- ****************************************************************************************
--                                    STORED PROCEDURES
--
-- [sp_WebPlus_MarkBookMaintGroupElement_Update]      -- updated
-- [sp_WebPlus_MarkBookMaintCopyToAllGroups_Update]   -- updated
-- [sp_WebPlus_MarkBookOption_Update]                 -- updated 
-- [sp_WebPlus_MarkBookMaint_Select]                  -- updated
-- [sp_WebPlus_VAStudentAvailableGrades_Select]       -- updated
-- [sp_WebPlus_SystemMaint_Select]                    -- new
-- [sp_WebPlus_SystemMaintInYearGrade_Update]         -- new
-- [sp_WebPlus_SystemMaintEffortGrade_Update]         -- new
-- [sp_WebPlus_SystemMaintPassFailGrade_Update]       -- new
-- [sp_WebPlus_SystemMaintNoGradeGrade_Update]        -- new
-- [sp_WebPlus_SystemSettingFlag_Update]              -- new
-- [sp_WebPlus_SystemMaintUserDefinedField_Update]    -- new
--
-- UKLocalTimeFromUtc (function)            -- Get GMT time from UTC
-- [sp_WebPlus_MarkBook_SaveMarkbookGrade]  -- Replace GetUTCDate with UKLocalTimeFromUtc
-- [sp_WebPlus_MarkBook_GetMarkbookTree]    -- Remove to JSON
-- [sp_WebPlus_Markbook_EnrolmentElementResubUpdateCopy]  -- Replace GetUTCDate with UKLocalTimeFromUtc
-- [sp_WebPlus_MarkBook_DynamicGradeData]   -- Drop if exists 
--
-- [sp_WebPlus_DeltaMaint_Select]                      -- new
-- [sp_WebPlus_DeltaMaint_Categories_Update]           -- new
-- [sp_WebPlus_DeltaMaint_CategoryBanding_Update]      -- new
-- [sp_WebPlus_DeltaMaint_StartDate_Update]            -- new
-- [sp_WebPlus_DeltaMaint_InfoFlags_Update]            -- new
--
-- [sp_WebPlus_EMStudents_Select]                      -- updated
-- ****************************************************************************************

/****** Object:  StoredProcedure [dbo].[sp_WebPlus_MarkBookMaintGroupElement_Update]    Script Date: 29/07/2025 10:27:08 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[sp_WebPlus_MarkBookMaintGroupElement_Update]
  @StaffID              INTEGER,
  @GroupElementID       INTEGER,
  @DateSet              DATE    = NULL,
  @DateExpected         DATE    = NULL,
  @ResubmissionLaunch   DATE    = NULL,
  @ResubmissionHandIn   DATE    = NULL,
  @RetakeLaunch         DATE    = NULL,
  @RetakeHandIn         DATE    = NULL,
  @DisplayInStudentView BIT = 1,
  @SelectedStaffID      INTEGER = NULL
AS
-- ====================================================================
-- Author:		Andy Breward
-- Create date: 08/04/2025
-- Modified:    29/07/2025 AndyB v1.40.1 Added 4 new date columns
-- Descripton:	SP to Update the OGP_GroupElement fields (DateSet, DateExpected, StaffID, DisplayInStudentView)
-- Examples:    exec sp_WebPlus_MarkBookMaintGroupElement_Update 3, 57, '2022-09-23', '2022-10-23', 1, 3
-- ====================================================================
DECLARE @returnValue  INT = 0;
DECLARE @newID        INT = 0;
DECLARE @deletedID    INT = 0;
DECLARE @Updated      DATETIME = GetDate();

DECLARE @VALUE_FALSE  BIT = 0;
DECLARE @VALUE_TRUE   BIT = 1;

DECLARE @ChangesToSave BIT = @VALUE_FALSE;

DECLARE @UserName       VARCHAR(255);
DECLARE @UserForenames  VARCHAR(100);
DECLARE @UserSurname    VARCHAR(100);

DECLARE @RowDescription VARCHAR(500);
DECLARE @TypeOfChange   VARCHAR(50);

DECLARE @CourseName  VARCHAR(250) = '';
DECLARE @ElementName VARCHAR(550) = '';
DECLARE @GroupCode   VARCHAR(50)  = '';

DECLARE @GroupID                   INTEGER = 0;
DECLARE @CourseID                  INTEGER = 0;

DECLARE @DateSet_Existing          DATE;
DECLARE @DateExpected_Existing     DATE;

DECLARE @ResubmissionLaunch_Existing DATE;
DECLARE @ResubmissionHandIn_Existing DATE;
DECLARE @RetakeLaunch_Existing DATE;
DECLARE @RetakeHandIn_Existing DATE;

DECLARE @SelectedStaffID_Existing  INTEGER;
DECLARE @DisplayInStudentView_Existing  BIT;

--***********************************************************************************

Print 'Running sp_WebPlus_MarkBookMaintGroupElement_Update';

IF EXISTS (SELECT 1 FROM Staff WHERE StaffID = @StaffID)
BEGIN

    --Get the Staff Username
    SELECT 
		@UserName      = [User].UserName,
		@UserForenames = [User].Forenames,
		@UserSurname   = [User].Surname
    FROM Staff 
		INNER JOIN [User] ON [User].UserID = Staff.UserID
    WHERE 
	    StaffID = @StaffId;

    --set default return to -1 (which means ID doesnt exist)
    SET @returnValue = -1;

	IF EXISTS(SELECT 1 FROM OGP_GroupElement WHERE ID = @GroupElementID)
	BEGIN
		Print 'ID Exists = ' + Convert(VARCHAR, @GroupElementID);

		--Get the Existing Details 
		SELECT
			@DateSet_Existing              = OGP_GroupElement.DateSet,
			@DateExpected_Existing         = OGP_GroupElement.DateExpected,
			@ResubmissionLaunch_Existing   = OGP_GroupElement.ResubmissionLaunch,
			@ResubmissionHandIn_Existing   = OGP_GroupElement.ResubmissionHandIn,
			@RetakeLaunch_Existing         = OGP_GroupElement.RetakeLaunch,
			@RetakeHandIn_Existing         = OGP_GroupElement.RetakeHandIn,
			@DisplayInStudentView_Existing = OGP_GroupElement.DisplayInStudentView,
			@SelectedStaffID_Existing      = OGP_GroupElement.StaffID,
			@ElementName                   = (OGP_Element.ElementCode + ' ' + IsNull(OGP_Element.Description, '') ),
			@GroupID                       = OGP_GroupElement.OGP_GroupID,
			@GroupCode                     = OGP_Group.OGP_GroupCode,
			@CourseID                      = OGP_Group.CourseID
		FROM
			OGP_GroupElement
				INNER JOIN OGP_Group   ON OGP_GroupElement.OGP_GroupID   = OGP_Group.ID
				INNER JOIN OGP_Element ON OGP_GroupElement.OGP_ElementID = OGP_Element.ID
  		WHERE
			OGP_GroupElement.ID = @GroupElementID;

		Print 'New DateSet      = ' + IsNull(Convert(VARCHAR, @DateSet), 'Null');
		Print 'New DateExpected = ' + IsNull(Convert(VARCHAR, @DateExpected), 'Null');

		Print 'New ResubmissionLaunch = ' + IsNull(Convert(VARCHAR, @ResubmissionLaunch), 'Null');
		Print 'New ResubmissionHandIn = ' + IsNull(Convert(VARCHAR, @ResubmissionHandIn), 'Null');
		Print 'New RetakeLaunch       = ' + IsNull(Convert(VARCHAR, @RetakeLaunch), 'Null');
		Print 'New RetakeHandIn       = ' + IsNull(Convert(VARCHAR, @RetakeHandIn), 'Null');

		Print 'New StaffID      = ' + IsNull(Convert(VARCHAR, @SelectedStaffID), 'Null');
		Print 'Existing DateSet      = ' + IsNull(Convert(VARCHAR, @DateSet_Existing), 'Null');
		Print 'Existing DateExpected = ' + IsNull(Convert(VARCHAR, @DateExpected_Existing), 'Null');
		Print 'Existing StaffID      = ' + IsNull(Convert(VARCHAR, @SelectedStaffID_Existing), 'Null');

		--  Get the Course details
		IF @CourseID > 0
		BEGIN
			SELECT @CourseName = (Course.CourseCode + ' ' + IsNull(Course.Title, '') )
			FROM Course
			WHERE ID = @CourseID;
		END


		--Check for Updates 
		IF IsNull(@DateSet, '1900-01-01') != IsNull(@DateSet_Existing, '1900-01-01')
			SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF IsNull(@DateExpected, '1900-01-01') != IsNull(@DateExpected_Existing, '1900-01-01')
			SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF IsNull(@ResubmissionLaunch, '1900-01-01') != IsNull(@ResubmissionLaunch_Existing, '1900-01-01')
			SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF IsNull(@ResubmissionHandIn, '1900-01-01') != IsNull(@ResubmissionHandIn_Existing, '1900-01-01')
			SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF IsNull(@RetakeLaunch, '1900-01-01') != IsNull(@RetakeLaunch_Existing, '1900-01-01')
			SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF IsNull(@RetakeHandIn, '1900-01-01') != IsNull(@RetakeHandIn_Existing, '1900-01-01')
			SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF IsNull(@SelectedStaffID_Existing, -1) != IsNull(@SelectedStaffID, -1)
			SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @DisplayInStudentView_Existing != @DisplayInStudentView
			SET @ChangesToSave = @VALUE_TRUE;

		IF @ChangesToSave = @VALUE_TRUE
		BEGIN
			Print 'Saving Changes...';

			UPDATE 
				OGP_GroupElement
			SET
				DateSet              = @DateSet,
				DateExpected         = @DateExpected,
				ResubmissionLaunch   = @ResubmissionLaunch,
				ResubmissionHandIn   = @ResubmissionHandIn,
				RetakeLaunch         = @RetakeLaunch,
				RetakeHandIn         = @RetakeHandIn,
				DisplayInStudentView = @DisplayInStudentView,
				StaffID              = @SelectedStaffID
			WHERE
				ID = @GroupElementID;

			SET @returnValue = @GroupElementID;

			--Create the Audit record
			SET @TypeOfChange    = 'UPDATE';
			SET @RowDescription  = 'Updated ID=' + Convert(VARCHAR, @GroupElementID);

			IF IsNull(@DateSet, '1900-01-01') != IsNull(@DateSet_Existing, '1900-01-01') 
			BEGIN
				INSERT INTO OGP_MarkbookStructureAudit
					(AuditDate, AuditBy,   AuditChange,   TableName,          RowID,           RowDescription,   CourseName,  GroupCode,  ElementName,   FieldName,    OldValueDescription, NewValueDescription)
				VALUES
					(@Updated, @UserName, @TypeOfChange, 'OGP_GroupElement', @GroupElementID, @RowDescription,  @CourseName, @GroupCode, @ElementName,   'DateSet',    @DateSet_Existing,   @DateSet);
			END
			IF IsNull(@DateExpected, '1900-01-01') != IsNull(@DateExpected_Existing, '1900-01-01') 
			BEGIN
				INSERT INTO OGP_MarkbookStructureAudit
					(AuditDate, AuditBy,   AuditChange,   TableName,          RowID,           RowDescription,   CourseName,  GroupCode,  ElementName,   FieldName,    OldValueDescription, NewValueDescription)
				VALUES
					(@Updated, @UserName, @TypeOfChange, 'OGP_GroupElement', @GroupElementID, @RowDescription,  @CourseName, @GroupCode, @ElementName,   'DateExpected',    @DateExpected_Existing,   @DateExpected);
			END

			IF IsNull(@ResubmissionLaunch, '1900-01-01') != IsNull(@ResubmissionLaunch_Existing, '1900-01-01') 
			BEGIN
				INSERT INTO OGP_MarkbookStructureAudit
					(AuditDate, AuditBy,   AuditChange,   TableName,          RowID,           RowDescription,   CourseName,  GroupCode,  ElementName,   FieldName,    OldValueDescription, NewValueDescription)
				VALUES
					(@Updated, @UserName, @TypeOfChange, 'OGP_GroupElement', @GroupElementID, @RowDescription,  @CourseName, @GroupCode, @ElementName,   'ResubmissionLaunch',    @ResubmissionLaunch_Existing,   @ResubmissionLaunch);
			END
			IF IsNull(@ResubmissionHandIn, '1900-01-01') != IsNull(@ResubmissionHandIn_Existing, '1900-01-01') 
			BEGIN
				INSERT INTO OGP_MarkbookStructureAudit
					(AuditDate, AuditBy,   AuditChange,   TableName,          RowID,           RowDescription,   CourseName,  GroupCode,  ElementName,   FieldName,    OldValueDescription, NewValueDescription)
				VALUES
					(@Updated, @UserName, @TypeOfChange, 'OGP_GroupElement', @GroupElementID, @RowDescription,  @CourseName, @GroupCode, @ElementName,   'ResubmissionHandIn',    @ResubmissionHandIn_Existing,   @ResubmissionHandIn);
			END

			IF IsNull(@RetakeLaunch, '1900-01-01') != IsNull(@RetakeLaunch_Existing, '1900-01-01') 
			BEGIN
				INSERT INTO OGP_MarkbookStructureAudit
					(AuditDate, AuditBy,   AuditChange,   TableName,          RowID,           RowDescription,   CourseName,  GroupCode,  ElementName,   FieldName,    OldValueDescription, NewValueDescription)
				VALUES
					(@Updated, @UserName, @TypeOfChange, 'OGP_GroupElement', @GroupElementID, @RowDescription,  @CourseName, @GroupCode, @ElementName,   'RetakeLaunch',    @RetakeLaunch_Existing,   @RetakeLaunch);
			END
			IF IsNull(@RetakeHandIn, '1900-01-01') != IsNull(@RetakeHandIn_Existing, '1900-01-01') 
			BEGIN
				INSERT INTO OGP_MarkbookStructureAudit
					(AuditDate, AuditBy,   AuditChange,   TableName,          RowID,           RowDescription,   CourseName,  GroupCode,  ElementName,   FieldName,    OldValueDescription, NewValueDescription)
				VALUES
					(@Updated, @UserName, @TypeOfChange, 'OGP_GroupElement', @GroupElementID, @RowDescription,  @CourseName, @GroupCode, @ElementName,   'RetakeHandIn',    @RetakeHandIn_Existing,   @RetakeHandIn);
			END

			IF IsNull(@SelectedStaffID_Existing, -1) != IsNull(@SelectedStaffID, -1) 
			BEGIN
				INSERT INTO OGP_MarkbookStructureAudit
					(AuditDate, AuditBy,   AuditChange,   TableName,          RowID,           RowDescription,   CourseName,  GroupCode,  ElementName,   FieldName,    OldValueDescription, NewValueDescription)
				VALUES
					(@Updated, @UserName, @TypeOfChange, 'OGP_GroupElement', @GroupElementID, @RowDescription,  @CourseName, @GroupCode, @ElementName,   'StaffID',    @SelectedStaffID_Existing,   @SelectedStaffID);
			END
			IF @DisplayInStudentView_Existing != @DisplayInStudentView 
			BEGIN
				INSERT INTO OGP_MarkbookStructureAudit
					(AuditDate, AuditBy,   AuditChange,   TableName,          RowID,           RowDescription,   CourseName,  GroupCode,  ElementName,   FieldName,                  OldValueDescription,              NewValueDescription)
				VALUES
					(@Updated, @UserName, @TypeOfChange, 'OGP_GroupElement', @GroupElementID, @RowDescription,  @CourseName, @GroupCode, @ElementName,   'DisplayInStudentView',    @DisplayInStudentView_Existing,   @DisplayInStudentView);
			END

		END
		ELSE
		BEGIN
			Print 'No Changes to Save...';

			-- set return to 0 to indicate no changes
			SET @returnValue = 0;
		END
	END
END
ELSE
BEGIN
    -- set return to -2 to indicate StaffID not found
    SET @returnValue = -2;
END

Print 'Returning ' + Convert(VARCHAR, @returnValue);

SELECT @returnValue AS ReturnValue;
GO






/****** Object:  StoredProcedure [dbo].[sp_WebPlus_MarkBookMaintCopyToAllGroups_Update]    Script Date: 29/07/2025 12:22:15 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[sp_WebPlus_MarkBookMaintCopyToAllGroups_Update]
  @StaffID          INTEGER,
  @GroupID          INTEGER,
  @ElementID        INTEGER,         
  @DateSet          DATE    = NULL,
  @DateExpected     DATE    = NULL,
  @ResubmissionLaunch    DATE    = NULL,
  @ResubmissionHandIn    DATE    = NULL,
  @RetakeLaunch          DATE    = NULL,
  @RetakeHandIn          DATE    = NULL,
  @SelectedStaffID  INTEGER = NULL
AS
-- ====================================================================
-- Author:		Andy Breward
-- Create date: 08/04/2025 
-- Modified:    29/07/2025 AndyB v1.40.1 Added 4 new date columns
-- Descripton:	SP to Update the OGP_GroupElement record values: DateSet, DateExpected, StaffID
-- ====================================================================
DECLARE @returnValue    INT = 0;
DECLARE @GroupElementID INT = 0;
DECLARE @deletedID      INT = 0;
DECLARE @Updated        DATETIME = GetDate();

DECLARE @VALUE_FALSE  BIT = 0;
DECLARE @VALUE_TRUE   BIT = 1;

DECLARE @UserName       VARCHAR(255);
DECLARE @UserForenames  VARCHAR(100);
DECLARE @UserSurname    VARCHAR(100);

DECLARE @RowDescription VARCHAR(500);
DECLARE @TypeOfChange   VARCHAR(50);

DECLARE @CourseName  VARCHAR(250) = '';
DECLARE @ElementName VARCHAR(550) = '';
DECLARE @GroupCode   VARCHAR(50)  = '';

DECLARE @CourseID                  INTEGER = 0;

DECLARE @DateSet_Existing          DATE;
DECLARE @DateExpected_Existing     DATE;

DECLARE @ResubmissionLaunch_Existing    DATE;
DECLARE @ResubmissionHandIn_Existing    DATE;
DECLARE @RetakeLaunch_Existing          DATE;
DECLARE @RetakeHandIn_Existing          DATE;

DECLARE @SelectedStaffID_Existing  INTEGER;

--***********************************************************************************


IF EXISTS (SELECT 1 FROM Staff WHERE StaffID = @staffId)
BEGIN

    --Get the Staff Username
    SELECT 
		@UserName = [User].UserName,
		@UserForenames = [User].Forenames,
		@UserSurname = [User].Surname
    FROM Staff 
		INNER JOIN [User] ON [User].UserID = Staff.UserID
    WHERE 
	    StaffID = @StaffId;

	--set the return value to 0 (no changes)
	SET @returnValue = 0;

	--Rule1 - only update if GroupEnrolment record already exists
	IF EXISTS(SELECT 1 FROM OGP_GroupElement WHERE OGP_GroupID = @GroupID AND OGP_ElementID = @ElementID)
	BEGIN
		--Get the Existing Details 
		SELECT
			@GroupElementID              = ID,
			@DateSet_Existing            = DateSet,
			@DateExpected_Existing       = DateExpected,
			@ResubmissionLaunch_Existing = ResubmissionLaunch,
			@ResubmissionHandIn_Existing = ResubmissionHandIn,
			@RetakeLaunch_Existing       = RetakeLaunch,
			@RetakeHandIn_Existing       = RetakeHandIn,
			@SelectedStaffID_Existing    = StaffID
		FROM
			OGP_GroupElement
  		WHERE
			OGP_GroupID   = @GroupID    AND 
			OGP_ElementID = @ElementID;

		--Get the Element details (code + description)
		SELECT 
			@ElementName = (OGP_Element.ElementCode + ' ' + IsNull(OGP_Element.Description, '') )
		FROM
			OGP_Element
		WHERE
			OGP_Element.ID = @ElementID;

		--Get the Group details (just code)
		SELECT
			@GroupCode   = OGP_Group.OGP_GroupCode,
			@CourseID    = OGP_Group.CourseID
		FROM
			OGP_Group   
  		WHERE
			OGP_Group.ID = @GroupID;

		--Get the Course details (code + description)
		IF @CourseID > 0
		BEGIN
			SELECT @CourseName = (Course.CourseCode + ' ' + IsNull(Course.Title, '') )
			FROM Course
			WHERE ID = @CourseID;
		END

		--Rule 2 - only update values if Null
		IF @DateSet_Existing IS Null
		BEGIN
			IF IsNull(@DateSet, '1900-01-01') != IsNull(@DateSet_Existing, '1900-01-01')
			BEGIN
				UPDATE 
					OGP_GroupElement
				SET
					DateSet      = @DateSet
  				WHERE
					OGP_GroupID = @GroupID AND OGP_ElementID = @ElementID;

				--Create the Audit record
				SET @TypeOfChange    = 'UPDATE';
				SET @RowDescription  = 'Updated ID=' + Convert(VARCHAR, @GroupElementID);

			    INSERT INTO OGP_MarkbookStructureAudit 
				    (AuditDate, AuditBy,   AuditChange,   TableName,         RowID,             RowDescription,   CourseName,  GroupCode,   ElementName,  FieldName, OldValueDescription, NewValueDescription)
			    VALUES
				    (@Updated, @UserName, @TypeOfChange, 'OGP_GroupElement', @GroupElementID,  @RowDescription,  @CourseName, @GroupCode,  @ElementName,  'DateSet', @DateSet_Existing,   @DateSet);

				--Set the return to the ID (to indicate changed)
				SET @returnValue = @GroupElementID;

			END
		END

		IF @DateExpected_Existing IS Null
		BEGIN
			IF IsNull(@DateExpected, '1900-01-01') != IsNull(@DateExpected_Existing, '1900-01-01')
			BEGIN
				UPDATE 
					OGP_GroupElement
				SET
					DateExpected      = @DateExpected
  				WHERE
					OGP_GroupID = @GroupID AND OGP_ElementID = @ElementID;

				--Create the Audit record
				SET @TypeOfChange    = 'UPDATE';
				SET @RowDescription  = 'Updated ID=' + Convert(VARCHAR, @GroupElementID);

			    INSERT INTO OGP_MarkbookStructureAudit 
				    (AuditDate, AuditBy,   AuditChange,   TableName,         RowID,             RowDescription,   CourseName,  GroupCode,   ElementName,  FieldName,      OldValueDescription,    NewValueDescription)
			    VALUES
				    (@Updated, @UserName, @TypeOfChange, 'OGP_GroupElement', @GroupElementID,  @RowDescription,  @CourseName, @GroupCode,  @ElementName,  'DateExpected', @DateExpected_Existing, @DateExpected);

				--Set the return to the ID (to indicate changed)
				SET @returnValue = @GroupElementID;
			END
		END

		IF @ResubmissionLaunch_Existing IS Null
		BEGIN
			IF IsNull(@ResubmissionLaunch, '1900-01-01') != IsNull(@ResubmissionLaunch_Existing, '1900-01-01')
			BEGIN
				UPDATE 
					OGP_GroupElement
				SET
					ResubmissionLaunch      = @ResubmissionLaunch
  				WHERE
					OGP_GroupID = @GroupID AND OGP_ElementID = @ElementID;

				--Create the Audit record
				SET @TypeOfChange    = 'UPDATE';
				SET @RowDescription  = 'Updated ID=' + Convert(VARCHAR, @GroupElementID);

			    INSERT INTO OGP_MarkbookStructureAudit 
				    (AuditDate, AuditBy,   AuditChange,   TableName,         RowID,             RowDescription,   CourseName,  GroupCode,   ElementName,  FieldName, OldValueDescription, NewValueDescription)
			    VALUES
				    (@Updated, @UserName, @TypeOfChange, 'OGP_GroupElement', @GroupElementID,  @RowDescription,  @CourseName, @GroupCode,  @ElementName,  'ResubmissionLaunch', @ResubmissionLaunch_Existing,   @ResubmissionLaunch);

				--Set the return to the ID (to indicate changed)
				SET @returnValue = @GroupElementID;

			END
		END

		IF @ResubmissionHandIn_Existing IS Null
		BEGIN
			IF IsNull(@ResubmissionHandIn, '1900-01-01') != IsNull(@ResubmissionHandIn_Existing, '1900-01-01')
			BEGIN
				UPDATE 
					OGP_GroupElement
				SET
					ResubmissionHandIn      = @ResubmissionHandIn
  				WHERE
					OGP_GroupID = @GroupID AND OGP_ElementID = @ElementID;

				--Create the Audit record
				SET @TypeOfChange    = 'UPDATE';
				SET @RowDescription  = 'Updated ID=' + Convert(VARCHAR, @GroupElementID);

			    INSERT INTO OGP_MarkbookStructureAudit 
				    (AuditDate, AuditBy,   AuditChange,   TableName,         RowID,             RowDescription,   CourseName,  GroupCode,   ElementName,  FieldName, OldValueDescription, NewValueDescription)
			    VALUES
				    (@Updated, @UserName, @TypeOfChange, 'OGP_GroupElement', @GroupElementID,  @RowDescription,  @CourseName, @GroupCode,  @ElementName,  'ResubmissionHandIn', @ResubmissionHandIn_Existing,   @ResubmissionHandIn);

				--Set the return to the ID (to indicate changed)
				SET @returnValue = @GroupElementID;

			END
		END

		IF @RetakeLaunch_Existing IS Null
		BEGIN
			IF IsNull(@RetakeLaunch, '1900-01-01') != IsNull(@RetakeLaunch_Existing, '1900-01-01')
			BEGIN
				UPDATE 
					OGP_GroupElement
				SET
					RetakeLaunch      = @RetakeLaunch
  				WHERE
					OGP_GroupID = @GroupID AND OGP_ElementID = @ElementID;

				--Create the Audit record
				SET @TypeOfChange    = 'UPDATE';
				SET @RowDescription  = 'Updated ID=' + Convert(VARCHAR, @GroupElementID);

			    INSERT INTO OGP_MarkbookStructureAudit 
				    (AuditDate, AuditBy,   AuditChange,   TableName,         RowID,             RowDescription,   CourseName,  GroupCode,   ElementName,  FieldName, OldValueDescription, NewValueDescription)
			    VALUES
				    (@Updated, @UserName, @TypeOfChange, 'OGP_GroupElement', @GroupElementID,  @RowDescription,  @CourseName, @GroupCode,  @ElementName,  'RetakeLaunch', @RetakeLaunch_Existing,   @RetakeLaunch);

				--Set the return to the ID (to indicate changed)
				SET @returnValue = @GroupElementID;

			END
		END

		IF @RetakeHandIn_Existing IS Null
		BEGIN
			IF IsNull(@RetakeHandIn, '1900-01-01') != IsNull(@RetakeHandIn_Existing, '1900-01-01')
			BEGIN
				UPDATE 
					OGP_GroupElement
				SET
					RetakeHandIn      = @RetakeHandIn
  				WHERE
					OGP_GroupID = @GroupID AND OGP_ElementID = @ElementID;

				--Create the Audit record
				SET @TypeOfChange    = 'UPDATE';
				SET @RowDescription  = 'Updated ID=' + Convert(VARCHAR, @GroupElementID);

			    INSERT INTO OGP_MarkbookStructureAudit 
				    (AuditDate, AuditBy,   AuditChange,   TableName,         RowID,             RowDescription,   CourseName,  GroupCode,   ElementName,  FieldName, OldValueDescription, NewValueDescription)
			    VALUES
				    (@Updated, @UserName, @TypeOfChange, 'OGP_GroupElement', @GroupElementID,  @RowDescription,  @CourseName, @GroupCode,  @ElementName,  'RetakeHandIn', @RetakeHandIn_Existing,   @RetakeHandIn);

				--Set the return to the ID (to indicate changed)
				SET @returnValue = @GroupElementID;

			END
		END

		IF @SelectedStaffID_Existing IS Null
		BEGIN
			IF IsNull(@SelectedStaffID_Existing, -1) != IsNull(@SelectedStaffID, -1) 
			BEGIN
				UPDATE 
					OGP_GroupElement
				SET
					StaffID      = @SelectedStaffID
  				WHERE
					OGP_GroupID = @GroupID AND OGP_ElementID = @ElementID;

				--Create the Audit record
				SET @TypeOfChange    = 'UPDATE';
				SET @RowDescription  = 'Updated ID=' + Convert(VARCHAR, @GroupElementID);

			    INSERT INTO OGP_MarkbookStructureAudit 
				    (AuditDate, AuditBy,   AuditChange,   TableName,         RowID,             RowDescription,   CourseName,  GroupCode,   ElementName,  FieldName,      OldValueDescription,    NewValueDescription)
			    VALUES
				    (@Updated, @UserName, @TypeOfChange, 'OGP_GroupElement', @GroupElementID,  @RowDescription,  @CourseName, @GroupCode,  @ElementName,  'StaffID', @SelectedStaffID_Existing,   @SelectedStaffID);

				--Set the return to the ID (to indicate changed)
				SET @returnValue = @GroupElementID;
			END
		END

	END
END
ELSE
BEGIN
    -- set return to -2 to indicate StaffID not found
    SET @returnValue = -2;
END

SELECT @returnValue AS ReturnValue;
GO







/****** Object:  StoredProcedure [dbo].[sp_WebPlus_MarkBookOption_Update]    Script Date: 07/08/2025 12:25:31 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[sp_WebPlus_MarkBookOption_Update]
  @StaffId           INTEGER,
  @CourseID          INTEGER,    -- Course.ID

  @MainQuestionID    INTEGER,    -- 0=MainQuestionID
  @QuestionAnswerID  INTEGER,    -- OGP_MarkbookOption.ID     

  @AnswerQuestion1ID INTEGER,
  @OptionSelected1ID INTEGER,

  @AnswerQuestion2ID INTEGER,    
  @OptionSelected2ID INTEGER     
AS
-- =============================================
-- Author:		Andy Breward
-- Create date: 08/04/2025 
-- Descripton:	SP to Update the Markbook Course Option
-- Modified:    10/08/2025 AndyB v1.40.1 Updated to save all options in one go 
-- =============================================
DECLARE @returnValue INT = 0;

DECLARE @Updated      DATETIME = GetDate();

DECLARE @VALUE_FALSE BIT = 0;
DECLARE @VALUE_TRUE  BIT = 1;

DECLARE @UserName       VARCHAR(255);
DECLARE @UserForenames  VARCHAR(100);
DECLARE @UserSurname    VARCHAR(100);

DECLARE @RowDescription VARCHAR(500);
DECLARE @TypeOfChange   VARCHAR(50);

DECLARE @CourseName  VARCHAR(250) = '';

DECLARE @ChangesToSave BIT = @VALUE_FALSE;

DECLARE @NewValueType VARCHAR(50);
DECLARE @NewValueDescr VARCHAR(5000);

DECLARE @IDnew INT = 0;
DECLARE @IDmain INT = 0;
DECLARE @IDopt1 INT = 0;
DECLARE @IDopt2 INT = 0;

DECLARE @MainQuestionAnswerID_Existing INT = 0;
DECLARE @Opt1QuestionAnswerID_Existing INT = 0;
DECLARE @Opt2QuestionAnswerID_Existing INT = 0;

DECLARE @OldValueDescription VARCHAR(5000);
DECLARE @NewValueDescription VARCHAR(5000);

--***********************************************************************************

IF EXISTS (SELECT 1 FROM Staff WHERE StaffID = @staffId)
BEGIN

  --Get the Staff Username
  SELECT 
		@UserName = [User].UserName,
		@UserForenames = [User].Forenames,
		@UserSurname = [User].Surname
  FROM Staff 
		INNER JOIN [User] ON [User].UserID = Staff.UserID
  WHERE 
	    StaffID = @staffId;


  -- Get the Course details
  IF @CourseID > 0
  BEGIN
	  SELECT 
	      @CourseName = (Course.CourseCode + ' ' + IsNull(Course.Title, '') )
	  FROM 
	      Course
	  WHERE 
	      ID = @CourseID;
  END

  --Check for the Main Question (ID=0)
  IF EXISTS (SELECT 1 FROM OGP_MarkbookOption WHERE ID = @MainQuestionID)
  BEGIN

	-- ------------------
	--   Existing Values
	-- ------------------

	--Find the previous Main Question record
	SET @IDmain = 0;
	SELECT 
		@IDmain = ID,
		@MainQuestionAnswerID_Existing = MarkbookOptionDetailID
	FROM 
		OGP_MarkbookCourseOption 
	WHERE 
		CourseID = @CourseID AND MarkbookOptionID = @MainQuestionID;

  	--Find the previous Option1 record
	SET @IDopt1 = 0;
	SELECT 
		@IDopt1 = ID,
		@Opt1QuestionAnswerID_Existing = MarkbookOptionDetailID
	FROM 
		OGP_MarkbookCourseOption 
	WHERE 
		CourseID = @CourseID AND MarkbookOptionID > 0 AND MArkbookoptionID % 2 = 1;  -- this will find MArkbookoptionIDs: 1,3,5

  	--Find the previous Option2 record
	SET @IDopt2 = 0;
	SELECT 
		@IDopt2 = ID,
		@Opt2QuestionAnswerID_Existing = MarkbookOptionDetailID
	FROM 
		OGP_MarkbookCourseOption 
	WHERE 
		CourseID = @CourseID AND MarkbookOptionID > 0 AND MArkbookoptionID % 2 = 0;  -- this will find MArkbookoptionIDs: 2,4,6

	Print 'Main ID=' + Convert(VARCHAR, @IDmain);
	Print 'Main QuestionID=' + Convert(VARCHAR, @MainQuestionID);
	Print 'Main AnswerID=' + Convert(VARCHAR, @QuestionAnswerID);

	Print 'Option1 ID=' + Convert(VARCHAR, @IDopt1);
	Print 'Option1 QuestionID=' + Convert(VARCHAR, @AnswerQuestion1ID);
	Print 'Option1 AnswerID=' + Convert(VARCHAR, @OptionSelected1ID);

	Print 'Option2 ID=' + Convert(VARCHAR, @IDopt2);
	Print 'Option2 QuestionID=' + Convert(VARCHAR, @AnswerQuestion2ID);
	Print 'Option2 AnswerID=' + Convert(VARCHAR, @OptionSelected2ID);


	--Clear down all previous selections for the Course
	DELETE FROM OGP_MarkbookCourseOption WHERE CourseID = @CourseID;


	-- ------------------
	--   Main Question
	-- ------------------
    --check if 0=None
	If @QuestionAnswerID <= 0
	BEGIN

		IF IsNull(@IDmain, 0) > 0
		BEGIN
			Print 'Main Deleting';

			SET @returnValue = @IDmain;
			SET @TypeOfChange    = 'DELETE';
			SET @RowDescription  = 'Deleted MainOption ID ' + Convert(VARCHAR, @IDmain);
			SELECT @OldValueDescription = IsNull(Description,'') FROM OGP_MarkbookOptionDetail WHERE ID = @MainQuestionAnswerID_Existing;
			SELECT @NewValueDescription = 'None';

			INSERT INTO OGP_MarkbookStructureAudit 
				(AuditDate, AuditBy,   AuditChange,   TableName,                  RowID,   RowDescription,   CourseName,  GroupCode,  ElementName,  FieldName,                 OldValueDescription,   NewValueDescription)
			VALUES
				(@Updated, @UserName, @TypeOfChange, 'OGP_MarkbookCourseOption', @IDmain, @RowDescription,  @CourseName, null,       null,         'MarkbookOptionDetailID',  @OldValueDescription,  @NewValueDescription);
		END

	END
	ELSE
	BEGIN

		--always Insert a new record (we deleted everything at the top)
		INSERT INTO OGP_MarkbookCourseOption 
			(CourseID, MarkbookOptionID, MarkbookOptionDetailID)
		VALUES
			(@CourseID, @MainQuestionID, @QuestionAnswerID);

		--get the new ID
		SELECT @IDnew = SCOPE_IDENTITY();

		IF IsNull(@IDmain, 0) > 0
		BEGIN
			Print 'Main Updating';
			SET @returnValue = @IDmain;
			SET @TypeOfChange    = 'UPDATE';
			SET @RowDescription  = 'Updated MainOption ID ' + Convert(VARCHAR, @IDmain);
			SELECT @OldValueDescription = IsNull(Description,'') FROM OGP_MarkbookOptionDetail WHERE ID = @MainQuestionAnswerID_Existing;
			SELECT @NewValueDescription = IsNull(Description,'') FROM OGP_MarkbookOptionDetail WHERE ID = @QuestionAnswerID;
		END
		ELSE
		BEGIN
			Print 'Main Inserting';
			SET @IDmain = @IDnew;
			SET @returnValue = @IDmain;
			SET @TypeOfChange    = 'INSERT';
			SET @RowDescription  = 'Inserted MainOption ID ' + Convert(VARCHAR, @IDmain);
			SET @OldValueDescription = '';
			SELECT @NewValueDescription = IsNull(Description,'') FROM OGP_MarkbookOptionDetail WHERE ID = @QuestionAnswerID;
		END

		INSERT INTO OGP_MarkbookStructureAudit 
			(AuditDate, AuditBy,   AuditChange,   TableName,                  RowID,   RowDescription,  CourseName,  GroupCode,  ElementName,  FieldName,                 OldValueDescription,   NewValueDescription)
		VALUES
			(@Updated, @UserName, @TypeOfChange, 'OGP_MarkbookCourseOption', @IDmain,     @RowDescription,  @CourseName, null,       null,         'MarkbookOptionDetailID', @OldValueDescription,  @NewValueDescription);

	END


  	-- ------------------
	--     Option 1
	-- ------------------

    IF @OptionSelected1ID <= 0
	BEGIN
	    IF IsNull(@IDopt1, 0) > 0
		BEGIN
			Print 'Option1 Deleting';

			SET @TypeOfChange    = 'DELETE';
			SET @RowDescription  = 'Deleted Option1 ID ' + Convert(VARCHAR, @IDopt1);
			SELECT @OldValueDescription = IsNull(Description,'') FROM OGP_MarkbookOptionDetail WHERE ID = @OPt1QuestionAnswerID_Existing;
			SELECT @NewValueDescription = 'None';

			INSERT INTO OGP_MarkbookStructureAudit 
				(AuditDate, AuditBy,   AuditChange,   TableName,                  RowID,   RowDescription,  CourseName,  GroupCode,  ElementName,  FieldName,                  OldValueDescription,   NewValueDescription)
			VALUES
				(@Updated, @UserName, @TypeOfChange, 'OGP_MarkbookCourseOption', @IDopt1,     @RowDescription,  @CourseName, null,       null,         'MarkbookOptionDetailID',   @OldValueDescription,  @NewValueDescription);
		END
	END
	ELSE
	BEGIN
		--always Insert a new record (we deleted everything at the top)
		INSERT INTO OGP_MarkbookCourseOption 
			(CourseID, MarkbookOptionID, MarkbookOptionDetailID)
		VALUES
			(@CourseID, @AnswerQuestion1ID, @OptionSelected1ID);

		--get the new ID
		SELECT @IDnew = SCOPE_IDENTITY();

		IF IsNull(@IDopt1, 0) > 0
		BEGIN
			Print 'Option1 Updating';
			SET @TypeOfChange    = 'UPDATE';
			SET @RowDescription  = 'Updated Option1 ID ' + Convert(VARCHAR, @IDopt1);
		END
		ELSE
		BEGIN
			Print 'Option1 Inserting';
			SET @IDopt1 = @IDnew;
			SET @TypeOfChange    = 'INSERT';
			SET @RowDescription  = 'Inserted Option1 ID ' + Convert(VARCHAR, @IDopt1);
		END

		SET @OldValueDescription = '';
		SET @NewValueDescription = '';
		SELECT @OldValueDescription = IsNull(Description,'') FROM OGP_MarkbookOptionDetail WHERE ID = @Opt1QuestionAnswerID_Existing;
		SELECT @NewValueDescription = IsNull(Description,'') FROM OGP_MarkbookOptionDetail WHERE ID = @OptionSelected1ID;

        INSERT INTO OGP_MarkbookStructureAudit 
			(AuditDate, AuditBy,   AuditChange,   TableName,                  RowID,   RowDescription,  CourseName,  GroupCode,  ElementName,  FieldName,                  OldValueDescription,   NewValueDescription)
		VALUES
			(@Updated, @UserName, @TypeOfChange, 'OGP_MarkbookCourseOption', @IDopt1,     @RowDescription,  @CourseName, null,       null,         'MarkbookOptionDetailID',   @OldValueDescription,  @NewValueDescription);

	END


  	-- ------------------
	--     Option 2
	-- ------------------

    IF @OptionSelected2ID <= 0
	BEGIN
	    IF IsNull(@IDopt2, 0) > 0
		BEGIN
			Print 'Option2 Deleting';

			SET @TypeOfChange    = 'DELETE';
			SET @RowDescription  = 'Deleted Option2 ID ' + Convert(VARCHAR, @IDopt2);
			SELECT @OldValueDescription = IsNull(Description,'') FROM OGP_MarkbookOptionDetail WHERE ID = @OPt2QuestionAnswerID_Existing;
			SELECT @NewValueDescription = 'None';

			INSERT INTO OGP_MarkbookStructureAudit 
				(AuditDate, AuditBy,   AuditChange,   TableName,                  RowID,   RowDescription,  CourseName,  GroupCode,  ElementName,  FieldName,                  OldValueDescription,   NewValueDescription)
			VALUES
				(@Updated, @UserName, @TypeOfChange, 'OGP_MarkbookCourseOption', @IDopt2,     @RowDescription,  @CourseName, null,       null,         'MarkbookOptionDetailID',   @OldValueDescription,  @NewValueDescription);
		END
	END
	ELSE
	BEGIN
		--always Insert a new record (we deleted everything at the top)
		INSERT INTO OGP_MarkbookCourseOption 
			(CourseID, MarkbookOptionID, MarkbookOptionDetailID)
		VALUES
			(@CourseID, @AnswerQuestion2ID, @OptionSelected2ID);

		--get the new ID
		SELECT @IDnew = SCOPE_IDENTITY();

		IF IsNull(@IDopt2, 0) > 0
		BEGIN
			Print 'Option2 Updating';
			SET @TypeOfChange    = 'UPDATE';
			SET @RowDescription  = 'Updated Option2 ID ' + Convert(VARCHAR, @IDopt2);
		END
		ELSE
		BEGIN
			Print 'Option2 Inserting';
			SET @IDopt2 = @IDnew;
			SET @TypeOfChange    = 'INSERT';
			SET @RowDescription  = 'Inserted Option2 ID ' + Convert(VARCHAR, @IDopt2);
		END

		SET @OldValueDescription = '';
		SET @NewValueDescription = '';
		SELECT @OldValueDescription = IsNull(Description,'') FROM OGP_MarkbookOptionDetail WHERE ID = @Opt2QuestionAnswerID_Existing;
		SELECT @NewValueDescription = IsNull(Description,'') FROM OGP_MarkbookOptionDetail WHERE ID = @OptionSelected2ID;

        INSERT INTO OGP_MarkbookStructureAudit 
			(AuditDate, AuditBy,   AuditChange,   TableName,                  RowID,   RowDescription,  CourseName,  GroupCode,  ElementName,  FieldName,                  OldValueDescription,   NewValueDescription)
		VALUES
			(@Updated, @UserName, @TypeOfChange, 'OGP_MarkbookCourseOption', @IDopt2,     @RowDescription,  @CourseName, null,       null,         'MarkbookOptionDetailID',   @OldValueDescription,  @NewValueDescription);

	END

  END
  ELSE
  BEGIN
		-- set return to -1 to indicate ID not found
		SET @returnValue = -1;
  END

END
ELSE
BEGIN
    -- set return to -2 to indicate StaffID not found
    SET @returnValue = -2;
END

SELECT @returnValue AS ReturnValue;
GO








SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[sp_WebPlus_MarkBook_DynamicGradeData]
    @EnrolmentID INT = NULL,
    @ElementID   INT = NULL,
    @CalcAssessment BIT = 0,
    @CalcUnit       BIT = 0,
    @GroupId        INT = 0,
    @AutoCompleteType INT = 1   -- 1=PMD  2=A*-D  3=PassOnly
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @ElementCodePrefixes VARCHAR(10) = '';

    -- Cross-assessment completion flags 
    DECLARE
        @AllPComplete     BIT = 0,
        @AllMComplete     BIT = 0,
        @AllDComplete     BIT = 0,
        @AllCComplete     BIT = 0,
        @AllBComplete     BIT = 0,
        @AllAComplete     BIT = 0,
        @AllAStarComplete BIT = 0;

    -- Existence flags 
    DECLARE
        @HasP BIT = 0, @HasM BIT = 0, @HasD BIT = 0,
        @HasC BIT = 0, @HasB BIT = 0, @HasA BIT = 0, @HasAStar BIT = 0;

    IF @AutoCompleteType = 1
        SET @ElementCodePrefixes = '[PMD]%';
    ELSE IF @AutoCompleteType = 2
        SET @ElementCodePrefixes = '[ABCD]%';
    ELSE IF @AutoCompleteType = 3
        SET @ElementCodePrefixes = '%';

    /* Cleanup (SQL 2014 compatible) */
    IF OBJECT_ID('tempdb..#directResults') IS NOT NULL DROP TABLE #directResults;
    IF OBJECT_ID('tempdb..#directResults2') IS NOT NULL DROP TABLE #directResults2;
    IF OBJECT_ID('tempdb..#directResults3') IS NOT NULL DROP TABLE #directResults3;
    IF OBJECT_ID('tempdb..#Tree') IS NOT NULL DROP TABLE #Tree;
    IF OBJECT_ID('tempdb..#grades') IS NOT NULL DROP TABLE #grades;
    IF OBJECT_ID('tempdb..#ElementTypeCheck') IS NOT NULL DROP TABLE #ElementTypeCheck;
    IF OBJECT_ID('tempdb..#CombinedFin') IS NOT NULL DROP TABLE #CombinedFin;
    IF OBJECT_ID('tempdb..#unitUpscaleResults') IS NOT NULL DROP TABLE #unitUpscaleResults;
    IF OBJECT_ID('tempdb..#unitUpscaleResults2') IS NOT NULL DROP TABLE #unitUpscaleResults2;
    IF OBJECT_ID('tempdb..#unitUpscaleResults3') IS NOT NULL DROP TABLE #unitUpscaleResults3;
    IF OBJECT_ID('tempdb..#unitresults') IS NOT NULL DROP TABLE #unitresults;
    IF OBJECT_ID('tempdb..#unitresults2') IS NOT NULL DROP TABLE #unitresults2;
    IF OBJECT_ID('tempdb..#unitresults3') IS NOT NULL DROP TABLE #unitresults3;

    /*  temp tables */
    CREATE TABLE #CombinedFin ( Parent INT, CompletionLevel VARCHAR(10), [Level] INT );

    CREATE TABLE #directResults (
        Parent INT, DirectParentElementTypeID INT,
        TopLevelElementTypeID INT, TopLevelParentID INT,
        AllComplete INT, CompletionLevel VARCHAR(10), [Level] INT
    );

    CREATE TABLE #unitUpscaleResults (
        TopLevelElementTypeID INT, TopLevelParentID INT, CompletionLevel VARCHAR(10)
    );

    CREATE TABLE #unitresults (
        TopLevelElementTypeID INT, TopLevelParentID INT, CompletionLevel VARCHAR(10)
    );

    CREATE TABLE #directResults2 (
        Parent INT, DirectParentElementTypeID INT,
        TopLevelElementTypeID INT, TopLevelParentID INT,
        AllComplete INT, CompletionLevel VARCHAR(10), [Level] INT
    );

    CREATE TABLE #unitUpscaleResults2 (
        TopLevelElementTypeID INT, TopLevelParentID INT, CompletionLevel VARCHAR(10)
    );

    CREATE TABLE #unitresults2 (
        TopLevelElementTypeID INT, TopLevelParentID INT, CompletionLevel VARCHAR(10)
    );

    CREATE TABLE #directResults3 (
        Parent INT, DirectParentElementTypeID INT,
        TopLevelElementTypeID INT, TopLevelParentID INT,
        AllComplete INT, CompletionLevel VARCHAR(10), [Level] INT
    );

    CREATE TABLE #unitUpscaleResults3 (
        TopLevelElementTypeID INT, TopLevelParentID INT, CompletionLevel VARCHAR(10)
    );

    CREATE TABLE #unitresults3 (
        TopLevelElementTypeID INT, TopLevelParentID INT, CompletionLevel VARCHAR(10)
    );

    /* Ensure the element is a Criterion */
    SELECT TOP 1 id, toplevelparentid, directparentid
    INTO #ElementTypeCheck
    FROM OGP_Element e
    WHERE e.ID = @ElementID AND e.OGP_ElementTypeID = 3;

    IF NOT EXISTS (SELECT 1 FROM #ElementTypeCheck)
    BEGIN
        PRINT('THIS IS NOT A CRITERIA');
        RETURN;
    END

    /* Relevant tree (only valid prefixes enter #grades) */
    SELECT
         e.[ID] AS [ElementId],
         e.[OGP_ElementTypeID],
         e.[ElementCode],
         e.[TopLevelParentID],
         e.[DirectParentID],
         dp.OGP_ElementTypeID AS DirectParentElementTypeID,
         tl.OGP_ElementTypeID AS TopLevelElementTypeID,
         ISNULL(ee.DoesNotDoElement,0) AS DoesNotDoElement
    INTO #Tree
    FROM OGP_Element e
    INNER JOIN OGP_GroupElement ge ON ge.OGP_GroupID = @GroupId AND ge.OGP_ElementID = e.ID
    LEFT JOIN OGP_Element dp ON dp.ID = e.DirectParentID
    LEFT JOIN OGP_Element tl ON tl.ID = e.TopLevelParentID
    OUTER APPLY (SELECT TOP 1 DoesNotDoElement FROM OGP_EnrolmentElement ee1 WHERE ee1.OGP_ElementID = e.ID AND ee1.OGP_EnrolmentID = @EnrolmentID) ee
    OUTER APPLY (SELECT TOP 1 DoesNotDoElement FROM OGP_EnrolmentElement ee2 WHERE ee2.OGP_ElementID = e.DirectParentID AND ee2.OGP_EnrolmentID = @EnrolmentID) eep
    OUTER APPLY (SELECT TOP 1 DoesNotDoElement FROM OGP_EnrolmentElement ee3 WHERE ee3.OGP_ElementID = e.TopLevelParentID AND ee3.OGP_EnrolmentID = @EnrolmentID) eetl
    WHERE
        (
            e.TopLevelParentID = (SELECT toplevelparentid FROM #ElementTypeCheck)
            OR e.ID IN (SELECT toplevelparentid FROM #ElementTypeCheck)
            OR e.ID IN (SELECT directparentid FROM #ElementTypeCheck)
        )
        AND ISNULL(ee.DoesNotDoElement,0)=0
        AND ISNULL(eetl.DoesNotDoElement,0)=0
        AND ISNULL(eep.DoesNotDoElement,0)=0
        AND e.RecordStatus <> 'OBSOLETE'
        AND (
             e.OGP_ElementTypeID <> 3
             OR (
                  e.OGP_ElementTypeID = 3
                  AND e.ElementCode IS NOT NULL
                  AND UPPER(e.ElementCode) LIKE @ElementCodePrefixes
                )
            );

    IF NOT EXISTS (SELECT 1 FROM #Tree) BEGIN PRINT('Ancestors not as expected'); RETURN; END
    IF NOT EXISTS (SELECT TOP 1 1 FROM #Tree WHERE OGP_ElementTypeID = 3) BEGIN PRINT('No criteria found'); RETURN; END

    /* Join to enrolment data */
    SELECT
         o.ElementId,
         o.ElementCode,
         @EnrolmentID AS EnrolmentID,
         o.DirectParentID,
         o.TopLevelParentID,
         ee.[ID] AS EnrolmentElementID,
         ee.[OGP_EnrolmentID],
         ee.[OGP_ElementID],
         CASE WHEN ee.[Complete] IS NULL THEN 0 ELSE ee.[Complete] END AS CompleteValue,
         ee.[DateMarked],
         o.OGP_ElementTypeID,
         o.DirectParentElementTypeID,
         o.TopLevelElementTypeID
    INTO #grades
    FROM #Tree o
    LEFT JOIN OGP_EnrolmentElement ee
      ON ee.OGP_ElementID = o.ElementId
     AND ee.OGP_EnrolmentID = @EnrolmentID
    WHERE o.OGP_ElementTypeID = 3;

    /* =========================
       1) PMD
       ========================= */
    IF @AutoCompleteType = 1
    BEGIN
        TRUNCATE TABLE #directResults;

        INSERT INTO #directResults (Parent, DirectParentElementTypeID, TopLevelElementTypeID, TopLevelParentID, AllComplete, CompletionLevel, [Level])
        SELECT
            g.DirectParentID,
            g.DirectParentElementTypeID,
            g.TopLevelElementTypeID,
            g.TopLevelParentID,
            g.MinComplete,
            CASE
                WHEN g.TotalD>0 AND g.CompleteD=g.TotalD
                     AND (g.TotalM=0 OR g.CompleteM=g.TotalM)
                     AND (g.TotalP=0 OR g.CompleteP=g.TotalP) THEN 'D'
                WHEN g.TotalM>0 AND g.CompleteM=g.TotalM
                     AND (g.TotalP=0 OR g.CompleteP=g.TotalP) THEN 'M'
                WHEN g.TotalP>0 AND g.CompleteP=g.TotalP THEN 'P'
                ELSE NULL
            END,
            g.DirectParentElementTypeID
        FROM (
            SELECT
                DirectParentID, DirectParentElementTypeID, TopLevelElementTypeID, TopLevelParentID,
                MIN(CompleteValue) AS MinComplete,
                SUM(CASE WHEN LEFT(UPPER(ElementCode),1)='P' THEN 1 ELSE 0 END) AS TotalP,
                SUM(CASE WHEN LEFT(UPPER(ElementCode),1)='P' AND CompleteValue=1 THEN 1 ELSE 0 END) AS CompleteP,
                SUM(CASE WHEN LEFT(UPPER(ElementCode),1)='M' THEN 1 ELSE 0 END) AS TotalM,
                SUM(CASE WHEN LEFT(UPPER(ElementCode),1)='M' AND CompleteValue=1 THEN 1 ELSE 0 END) AS CompleteM,
                SUM(CASE WHEN LEFT(UPPER(ElementCode),1)='D' THEN 1 ELSE 0 END) AS TotalD,
                SUM(CASE WHEN LEFT(UPPER(ElementCode),1)='D' AND CompleteValue=1 THEN 1 ELSE 0 END) AS CompleteD
            FROM #grades
            WHERE DirectParentElementTypeID IN (1,2)
            GROUP BY DirectParentID, DirectParentElementTypeID, TopLevelElementTypeID, TopLevelParentID
        ) g;

        IF (@CalcAssessment = 1)
        BEGIN
            INSERT INTO #CombinedFin (Parent, CompletionLevel, [Level])
            SELECT Parent, CompletionLevel, [Level]
            FROM #directResults
            WHERE [Level]=2;
        END

        IF (@CalcUnit = 1 AND EXISTS (SELECT 1 FROM #directResults))
        BEGIN
            IF NOT EXISTS (SELECT 1 FROM #directResults WHERE AllComplete=0)
            BEGIN
                TRUNCATE TABLE #unitUpscaleResults;

                INSERT INTO #unitUpscaleResults (TopLevelElementTypeID, TopLevelParentID, CompletionLevel)
                SELECT
                    TopLevelElementTypeID, [TopLevelParentID],
                    CASE
                        WHEN MIN(CASE WHEN CompletionLevel IS NULL THEN 0
                                      WHEN CompletionLevel='D' THEN 3
                                      WHEN CompletionLevel='M' THEN 2
                                      WHEN CompletionLevel='P' THEN 1 END)=0 THEN ''
                        WHEN MIN(CASE WHEN CompletionLevel='D' THEN 3 END)=3 THEN 'D'
                        WHEN MIN(CASE WHEN CompletionLevel IN('D','M') THEN CASE WHEN CompletionLevel='M' THEN 2 END END)=2 THEN 'M'
                        WHEN MIN(CASE WHEN CompletionLevel IN('D','M','P') THEN CASE WHEN CompletionLevel='P' THEN 1 END END)=1 THEN 'P'
                        ELSE ''
                    END
                FROM #directResults
                WHERE AllComplete=1
                GROUP BY TopLevelElementTypeID,[TopLevelParentID];

                INSERT INTO #CombinedFin (Parent,CompletionLevel,[Level])
                SELECT [TopLevelParentID],CompletionLevel,1 FROM #unitUpscaleResults;
            END
            ELSE
            BEGIN
                /* PARTIAL (not all complete) — PMD:
                   Award X only if EACH lower band (if it EXISTS) is FULLY COMPLETE across the unit.
                   - D requires: D complete.
                   - M requires: M complete AND (P missing OR P complete).
                   - P requires: P complete. */

                -- Reset existence + completeness
                SET @HasP=0; SET @HasM=0; SET @HasD=0;
                SET @AllPComplete=0; SET @AllMComplete=0; SET @AllDComplete=0;

                -- Existence
                SELECT @HasD = CASE WHEN EXISTS (
                        SELECT 1 FROM #grades
                        WHERE TopLevelParentID=(SELECT TopLevelParentID FROM #ElementTypeCheck)
                          AND LEFT(UPPER(ElementCode),1)='D') THEN 1 ELSE 0 END;
                SELECT @HasM = CASE WHEN EXISTS (
                        SELECT 1 FROM #grades
                        WHERE TopLevelParentID=(SELECT TopLevelParentID FROM #ElementTypeCheck)
                          AND LEFT(UPPER(ElementCode),1)='M') THEN 1 ELSE 0 END;
                SELECT @HasP = CASE WHEN EXISTS (
                        SELECT 1 FROM #grades
                        WHERE TopLevelParentID=(SELECT TopLevelParentID FROM #ElementTypeCheck)
                          AND LEFT(UPPER(ElementCode),1)='P') THEN 1 ELSE 0 END;

                -- Completeness (true only when rows exist AND all complete)
                SELECT @AllDComplete = CASE WHEN COUNT(*)>0 THEN 1 ELSE 0 END
                FROM (SELECT TopLevelParentID FROM #grades
                      WHERE TopLevelParentID=(SELECT TopLevelParentID FROM #ElementTypeCheck)
                        AND LEFT(UPPER(ElementCode),1)='D'
                      GROUP BY TopLevelParentID
                      HAVING MIN(CompleteValue)=1) s;

                SELECT @AllMComplete = CASE WHEN COUNT(*)>0 THEN 1 ELSE 0 END
                FROM (SELECT TopLevelParentID FROM #grades
                      WHERE TopLevelParentID=(SELECT TopLevelParentID FROM #ElementTypeCheck)
                        AND LEFT(UPPER(ElementCode),1)='M'
                      GROUP BY TopLevelParentID
                      HAVING MIN(CompleteValue)=1) s;

                SELECT @AllPComplete = CASE WHEN COUNT(*)>0 THEN 1 ELSE 0 END
                FROM (SELECT TopLevelParentID FROM #grades
                      WHERE TopLevelParentID=(SELECT TopLevelParentID FROM #ElementTypeCheck)
                        AND LEFT(UPPER(ElementCode),1)='P'
                      GROUP BY TopLevelParentID
                      HAVING MIN(CompleteValue)=1) s;

                TRUNCATE TABLE #unitresults;

                -- Highest award that respects lower-band prerequisites ONLY when those lower bands exist
                IF (@HasD=1 AND @AllDComplete=1
                    AND (@HasM=0 OR @AllMComplete=1)
                    AND (@HasP=0 OR @AllPComplete=1))
                    INSERT INTO #unitresults (TopLevelElementTypeID,[TopLevelParentID],CompletionLevel)
                    SELECT TopLevelElementTypeID,[TopLevelParentID],'D'
                    FROM #directResults GROUP BY TopLevelElementTypeID,[TopLevelParentID];
                ELSE IF (@HasM=1 AND @AllMComplete=1
                         AND (@HasP=0 OR @AllPComplete=1))
                    INSERT INTO #unitresults (TopLevelElementTypeID,[TopLevelParentID],CompletionLevel)
                    SELECT TopLevelElementTypeID,[TopLevelParentID],'M'
                    FROM #directResults GROUP BY TopLevelElementTypeID,[TopLevelParentID];
                ELSE IF (@HasP=1 AND @AllPComplete=1)
                    INSERT INTO #unitresults (TopLevelElementTypeID,[TopLevelParentID],CompletionLevel)
                    SELECT TopLevelElementTypeID,[TopLevelParentID],'P'
                    FROM #directResults GROUP BY TopLevelElementTypeID,[TopLevelParentID];
                ELSE
                    INSERT INTO #unitresults (TopLevelElementTypeID,[TopLevelParentID],CompletionLevel)
                    SELECT TopLevelElementTypeID,[TopLevelParentID],''
                    FROM #directResults GROUP BY TopLevelElementTypeID,[TopLevelParentID];

                INSERT INTO #CombinedFin (Parent,CompletionLevel,[Level])
                SELECT [TopLevelParentID],CompletionLevel,1 FROM #unitresults;
            END
        END
    END

    /* =========================
       2) A*-D
       ========================= */
    IF @AutoCompleteType = 2
    BEGIN
        TRUNCATE TABLE #directResults2;

        INSERT INTO #directResults2 (Parent, DirectParentElementTypeID, TopLevelElementTypeID, TopLevelParentID, AllComplete, CompletionLevel, [Level])
        SELECT
            g.DirectParentID,
            g.DirectParentElementTypeID,
            g.TopLevelElementTypeID,
            g.TopLevelParentID,
            g.MinComplete,
            CASE
                WHEN g.TotalAstar>0 AND g.CompleteAstar=g.TotalAstar
                     AND (g.TotalA=0 OR g.CompleteA=g.TotalA)
                     AND (g.TotalB=0 OR g.CompleteB=g.TotalB)
                     AND (g.TotalC=0 OR g.CompleteC=g.TotalC)
                     AND (g.TotalD=0 OR g.CompleteD=g.TotalD) THEN 'A*'
                WHEN g.TotalA>0 AND g.CompleteA=g.TotalA
                     AND (g.TotalB=0 OR g.CompleteB=g.TotalB)
                     AND (g.TotalC=0 OR g.CompleteC=g.TotalC)
                     AND (g.TotalD=0 OR g.CompleteD=g.TotalD) THEN 'A'
                WHEN g.TotalB>0 AND g.CompleteB=g.TotalB
                     AND (g.TotalC=0 OR g.CompleteC=g.TotalC)
                     AND (g.TotalD=0 OR g.CompleteD=g.TotalD) THEN 'B'
                WHEN g.TotalC>0 AND g.CompleteC=g.TotalC
                     AND (g.TotalD=0 OR g.CompleteD=g.TotalD) THEN 'C'
                WHEN g.TotalD>0 AND g.CompleteD=g.TotalD THEN 'D'
                ELSE NULL
            END,
            g.DirectParentElementTypeID
        FROM (
            SELECT
                DirectParentID,DirectParentElementTypeID,TopLevelElementTypeID,TopLevelParentID,
                MIN(CompleteValue) AS MinComplete,
                SUM(CASE WHEN LEFT(UPPER(ElementCode),2)='A*' THEN 1 ELSE 0 END) AS TotalAstar,
                SUM(CASE WHEN LEFT(UPPER(ElementCode),2)='A*' AND CompleteValue=1 THEN 1 ELSE 0 END) AS CompleteAstar,
                SUM(CASE WHEN LEFT(UPPER(ElementCode),1)='A' AND LEFT(UPPER(ElementCode),2)<>'A*' THEN 1 ELSE 0 END) AS TotalA,
                SUM(CASE WHEN LEFT(UPPER(ElementCode),1)='A' AND LEFT(UPPER(ElementCode),2)<>'A*' AND CompleteValue=1 THEN 1 ELSE 0 END) AS CompleteA,
                SUM(CASE WHEN LEFT(UPPER(ElementCode),1)='B' THEN 1 ELSE 0 END) AS TotalB,
                SUM(CASE WHEN LEFT(UPPER(ElementCode),1)='B' AND CompleteValue=1 THEN 1 ELSE 0 END) AS CompleteB,
                SUM(CASE WHEN LEFT(UPPER(ElementCode),1)='C' THEN 1 ELSE 0 END) AS TotalC,
                SUM(CASE WHEN LEFT(UPPER(ElementCode),1)='C' AND CompleteValue=1 THEN 1 ELSE 0 END) AS CompleteC,
                SUM(CASE WHEN LEFT(UPPER(ElementCode),1)='D' THEN 1 ELSE 0 END) AS TotalD,
                SUM(CASE WHEN LEFT(UPPER(ElementCode),1)='D' AND CompleteValue=1 THEN 1 ELSE 0 END) AS CompleteD
            FROM #grades
            WHERE DirectParentElementTypeID IN (1,2)
            GROUP BY DirectParentID,DirectParentElementTypeID,TopLevelElementTypeID,TopLevelParentID
        ) g;

        IF (@CalcAssessment=1)
        BEGIN
            INSERT INTO #CombinedFin (Parent,CompletionLevel,[Level])
            SELECT Parent,CompletionLevel,[Level]
            FROM #directResults2 WHERE [Level]=2;
        END

        IF (@CalcUnit=1 AND EXISTS(SELECT 1 FROM #directResults2))
        BEGIN
            IF NOT EXISTS(SELECT 1 FROM #directResults2 WHERE AllComplete=0)
            BEGIN
                TRUNCATE TABLE #unitUpscaleResults2;

                INSERT INTO #unitUpscaleResults2 (TopLevelElementTypeID, TopLevelParentID, CompletionLevel)
                SELECT
                    TopLevelElementTypeID,[TopLevelParentID],
                    CASE
                        WHEN MIN(CASE WHEN CompletionLevel IS NULL THEN 0
                                      WHEN CompletionLevel='A*' THEN 5
                                      WHEN CompletionLevel='A' THEN 4
                                      WHEN CompletionLevel='B' THEN 3
                                      WHEN CompletionLevel='C' THEN 2
                                      WHEN CompletionLevel='D' THEN 1 END)=0 THEN ''
                        WHEN MIN(CASE WHEN CompletionLevel='A*' THEN 5 END)=5 THEN 'A*'
                        WHEN MIN(CASE WHEN CompletionLevel IN('A*','A') THEN CASE WHEN CompletionLevel='A' THEN 4 END END)=4 THEN 'A'
                        WHEN MIN(CASE WHEN CompletionLevel IN('A*','A','B') THEN CASE WHEN CompletionLevel='B' THEN 3 END END)=3 THEN 'B'
                        WHEN MIN(CASE WHEN CompletionLevel IN('A*','A','B','C') THEN CASE WHEN CompletionLevel='C' THEN 2 END END)=2 THEN 'C'
                        WHEN MIN(CASE WHEN CompletionLevel IN('A*','A','B','C','D') THEN CASE WHEN CompletionLevel='D' THEN 1 END END)=1 THEN 'D'
                        ELSE ''
                    END
                FROM #directResults2
                WHERE AllComplete=1
                GROUP BY TopLevelElementTypeID,[TopLevelParentID];

                INSERT INTO #CombinedFin (Parent,CompletionLevel,[Level])
                SELECT [TopLevelParentID],CompletionLevel,1 FROM #unitUpscaleResults2;
            END
                       ELSE
            BEGIN
                /* PARTIAL (not all complete) — A*–D (vacuous ladder across the unit):
                   Award X if X is complete and every lower band (if it exists) is complete. */
                SET @HasD=0; SET @HasC=0; SET @HasB=0; SET @HasA=0; SET @HasAStar=0;
                SET @AllDComplete=0; SET @AllCComplete=0; SET @AllBComplete=0; SET @AllAComplete=0; SET @AllAStarComplete=0;

                -- Existence per band (any criterion anywhere in the unit)
                SELECT @HasD = CASE WHEN EXISTS (SELECT 1 FROM #grades
                                                 WHERE TopLevelParentID=(SELECT TopLevelParentID FROM #ElementTypeCheck)
                                                   AND LEFT(UPPER(ElementCode),1)='D') THEN 1 ELSE 0 END;
                SELECT @HasC = CASE WHEN EXISTS (SELECT 1 FROM #grades
                                                 WHERE TopLevelParentID=(SELECT TopLevelParentID FROM #ElementTypeCheck)
                                                   AND LEFT(UPPER(ElementCode),1)='C') THEN 1 ELSE 0 END;
                SELECT @HasB = CASE WHEN EXISTS (SELECT 1 FROM #grades
                                                 WHERE TopLevelParentID=(SELECT TopLevelParentID FROM #ElementTypeCheck)
                                                   AND LEFT(UPPER(ElementCode),1)='B') THEN 1 ELSE 0 END;
                SELECT @HasA = CASE WHEN EXISTS (SELECT 1 FROM #grades
                                                 WHERE TopLevelParentID=(SELECT TopLevelParentID FROM #ElementTypeCheck)
                                                   AND LEFT(UPPER(ElementCode),1)='A'
                                                   AND LEFT(UPPER(ElementCode),2)<>'A*') THEN 1 ELSE 0 END;
                SELECT @HasAStar = CASE WHEN EXISTS (SELECT 1 FROM #grades
                                                     WHERE TopLevelParentID=(SELECT TopLevelParentID FROM #ElementTypeCheck)
                                                       AND LEFT(UPPER(ElementCode),2)='A*') THEN 1 ELSE 0 END;

                -- “All complete” flags per band across the unit
                SELECT @AllDComplete = CASE WHEN COUNT(*)>0 THEN 1 ELSE 0 END
                FROM (SELECT TopLevelParentID
                      FROM #grades
                      WHERE TopLevelParentID=(SELECT TopLevelParentID FROM #ElementTypeCheck)
                        AND LEFT(UPPER(ElementCode),1)='D'
                      GROUP BY TopLevelParentID
                      HAVING MIN(CompleteValue)=1) s;

                SELECT @AllCComplete = CASE WHEN COUNT(*)>0 THEN 1 ELSE 0 END
                FROM (SELECT TopLevelParentID
                      FROM #grades
                      WHERE TopLevelParentID=(SELECT TopLevelParentID FROM #ElementTypeCheck)
                        AND LEFT(UPPER(ElementCode),1)='C'
                      GROUP BY TopLevelParentID
                      HAVING MIN(CompleteValue)=1) s;

                SELECT @AllBComplete = CASE WHEN COUNT(*)>0 THEN 1 ELSE 0 END
                FROM (SELECT TopLevelParentID
                      FROM #grades
                      WHERE TopLevelParentID=(SELECT TopLevelParentID FROM #ElementTypeCheck)
                        AND LEFT(UPPER(ElementCode),1)='B'
                      GROUP BY TopLevelParentID
                      HAVING MIN(CompleteValue)=1) s;

                SELECT @AllAComplete = CASE WHEN COUNT(*)>0 THEN 1 ELSE 0 END
                FROM (SELECT TopLevelParentID
                      FROM #grades
                      WHERE TopLevelParentID=(SELECT TopLevelParentID FROM #ElementTypeCheck)
                        AND LEFT(UPPER(ElementCode),1)='A'
                        AND LEFT(UPPER(ElementCode),2)<>'A*'
                      GROUP BY TopLevelParentID
                      HAVING MIN(CompleteValue)=1) s;

                SELECT @AllAStarComplete = CASE WHEN COUNT(*)>0 THEN 1 ELSE 0 END
                FROM (SELECT TopLevelParentID
                      FROM #grades
                      WHERE TopLevelParentID=(SELECT TopLevelParentID FROM #ElementTypeCheck)
                        AND LEFT(UPPER(ElementCode),2)='A*'
                      GROUP BY TopLevelParentID
                      HAVING MIN(CompleteValue)=1) s;

                TRUNCATE TABLE #unitresults2;

                DECLARE @UnitAward VARCHAR(10) = '';

                IF (@HasAStar=1 AND @AllAStarComplete=1
                    AND (@HasA=0 OR @AllAComplete=1)
                    AND (@HasB=0 OR @AllBComplete=1)
                    AND (@HasC=0 OR @AllCComplete=1)
                    AND (@HasD=0 OR @AllDComplete=1))
                    SET @UnitAward='A*';
                ELSE IF (@HasA=1 AND @AllAComplete=1
                         AND (@HasB=0 OR @AllBComplete=1)
                         AND (@HasC=0 OR @AllCComplete=1)
                         AND (@HasD=0 OR @AllDComplete=1))
                    SET @UnitAward='A';
                ELSE IF (@HasB=1 AND @AllBComplete=1
                         AND (@HasC=0 OR @AllCComplete=1)
                         AND (@HasD=0 OR @AllDComplete=1))
                    SET @UnitAward='B';
                ELSE IF (@HasC=1 AND @AllCComplete=1
                         AND (@HasD=0 OR @AllDComplete=1))
                    SET @UnitAward='C';
                ELSE IF (@HasD=1 AND @AllDComplete=1)
                    SET @UnitAward='D';
                ELSE
                    SET @UnitAward='';

                INSERT INTO #unitresults2 (TopLevelElementTypeID,[TopLevelParentID],CompletionLevel)
                SELECT TopLevelElementTypeID,[TopLevelParentID],@UnitAward
                FROM #directResults2
                GROUP BY TopLevelElementTypeID,[TopLevelParentID];

                INSERT INTO #CombinedFin (Parent,CompletionLevel,[Level])
                SELECT [TopLevelParentID],CompletionLevel,1 FROM #unitresults2;
            END

        END
    END

    /* =========================
       3) PassOnly 
       ========================= */
    IF @AutoCompleteType = 3
    BEGIN
        TRUNCATE TABLE #directResults3;

        INSERT INTO #directResults3 (Parent, DirectParentElementTypeID, TopLevelElementTypeID, [TopLevelParentID], AllComplete, CompletionLevel, [Level])
        SELECT
            DirectParentID,
            DirectParentElementTypeID,
            TopLevelElementTypeID,
            [TopLevelParentID],
            MIN(CompleteValue),
            CASE
                WHEN SUM(CASE WHEN ISNULL(ElementCode,'')<>'' AND CompleteValue=1 THEN 1 ELSE 0 END)
                     = COUNT(CASE WHEN ISNULL(ElementCode,'')<>'' THEN 1 END) THEN 'P'
                ELSE NULL
            END,
            DirectParentElementTypeID
        FROM #grades
        WHERE DirectParentElementTypeID IN (1,2)
        GROUP BY DirectParentID,DirectParentElementTypeID,TopLevelElementTypeID,[TopLevelParentID];

        IF (@CalcAssessment=1)
        BEGIN
            INSERT INTO #CombinedFin (Parent,CompletionLevel,[Level])
            SELECT Parent,CompletionLevel,[Level]
            FROM #directResults3 WHERE [Level]=2;
        END

        IF (@CalcUnit=1 AND EXISTS(SELECT 1 FROM #directResults3))
        BEGIN
            IF NOT EXISTS(SELECT 1 FROM #directResults3 WHERE AllComplete=0)
            BEGIN
                TRUNCATE TABLE #unitUpscaleResults3;

                INSERT INTO #unitUpscaleResults3 (TopLevelElementTypeID,[TopLevelParentID],CompletionLevel)
                SELECT TopLevelElementTypeID,[TopLevelParentID],'P'
                FROM #directResults3 WHERE AllComplete=1
                GROUP BY TopLevelElementTypeID,[TopLevelParentID];

                INSERT INTO #CombinedFin (Parent,CompletionLevel,[Level])
                SELECT [TopLevelParentID],CompletionLevel,1 FROM #unitUpscaleResults3;
            END
           ELSE
                BEGIN
                    TRUNCATE TABLE #unitresults3;

                    -- partial: NOT all assessments are complete -> unit has NO grade
                    INSERT INTO #unitresults3 (TopLevelElementTypeID,[TopLevelParentID],CompletionLevel)
                    SELECT TopLevelElementTypeID,[TopLevelParentID], ''   -- was 'P'
                    FROM #directResults3
                    GROUP BY TopLevelElementTypeID,[TopLevelParentID];

                    INSERT INTO #CombinedFin (Parent,CompletionLevel,[Level])
                    SELECT [TopLevelParentID],CompletionLevel,1 FROM #unitresults3;
                END


        END
    END

    /* Final output (only rows that change) */
    SELECT *
    FROM (
        SELECT
            e.ID AS ParentElementID,
            CASE WHEN ee.Complete=1 THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END AS CompleteOld,
            ISNULL(ee.Grade,'') AS GradeOld,
            ISNULL(cf.CompletionLevel,'') AS GradeNew,
            cf.[Level]
        FROM OGP_Element e
        INNER JOIN #CombinedFin cf ON cf.Parent=e.ID
        LEFT JOIN OGP_EnrolmentElement ee
               ON ee.OGP_ElementID=e.ID
              AND ee.OGP_EnrolmentID=@EnrolmentID
    ) sub
    WHERE sub.GradeOld<>'NP'
      AND (
            sub.GradeOld<>GradeNew
         OR (sub.CompleteOld=1 AND GradeNew='')
         OR (sub.CompleteOld=0 AND GradeNew<>'')
      );
	  /* prove existence of sp to unit test*/
	  /* UT-MARKER: MISSING-START-LADDER */
END
GO










/****** Object:  StoredProcedure [dbo].[sp_WebPlus_VAStudentAvailableGrades_Select]    Script Date: 03/09/2025 13:08:04 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[sp_WebPlus_VAStudentAvailableGrades_Select]
@EstactVAID      INT

AS
-- =============================================
-- Author:		Andrew Breward
-- Create date: AndyB 11/12/2022 v1.0.0
-- Descripton:	SP to retrieve the available Grades for a Student ID in EstactVA
-- Modified:    v1.40.1 AndyB Added Obsolete = 0 to UnGradedQualifications_PointsGrades and GradingScheme_NoGrade 
-- Example:     exec sp_WebPlus_VAStudentAvailableGrades_Select 938637
-- Note: is this the same as sp_WebPlus_Determine_GradesPoints_For_Enrolment
--       if it is, sp_WebPlus_Determine_GradesPoints_For_Enrolment needs id and  L2Points adding
-- =============================================

DECLARE @va_type VARCHAR(50);

SELECT @va_type = IsNull(EstactVA.VA_Type, 'Missing') FROM EstActVA WHERE ID = @EstactVAID;

IF @va_type = 'L3VA' BEGIN
	SELECT 
		QualificationCodeGradeLookup.ID, QualificationCodeGradeLookup.Grade, QualificationCodeGradeLookup.Points, null AS L2Points
	FROM QualificationCodeGradeLookup
		INNER JOIN QualificationLookup
		ON QualificationCodeGradeLookup.QualificationCodeID = QualificationLookup.QualificationCodeID
			INNER JOIN EstActVA
			ON QualificationLookup.ID = EstActVA.QualificationID
	WHERE VA_Type = 'L3VA' AND EstActVA.ID = @EstactVAID
	ORDER BY QualificationCodeGradeLookup.GradeNo
END
ELSE IF @va_type = 'Pass Only' BEGIN
	SELECT 
		UnGradedQualifications_PointsGrades.ID, UnGradedQualifications_PointsGrades.Grade, UnGradedQualifications_PointsGrades.Points, null AS L2Points
	FROM UnGradedQualifications_PointsGrades
	CROSS JOIN EstActVA
	WHERE EstActVA.VA_Type = 'Pass Only' AND UnGradedQualifications_PointsGrades.ViewOnWebsite = 1 AND EstActVA.ID = @EstactVAID
	AND   UnGradedQualifications_PointsGrades.Obsolete = 0  -- added v1.40.1
	ORDER BY UnGradedQualifications_PointsGrades.GradeNo
END
ELSE IF @va_type = 'CA' BEGIN
	SELECT CA_QualType_Grade.ID, CA_QualType_Grade.Grade, CA_QualType_Grade.Points, CA_QualType_Grade.CAL2Points AS L2Points
	FROM CA_QualType_Grade
		INNER JOIN EstActVA
		ON CA_QualType_Grade.CA_QualTypeID = EstActVA.CA_QualTypeID
	WHERE VA_Type = 'CA' AND EstActVA.ID = @EstactVAID
	ORDER BY CA_QualType_Grade.GradeNo
END
ELSE IF @va_type = 'Ofqual Graded' BEGIN
	SELECT GradingScheme_Ofqual.ID, GradingScheme_Ofqual.Grade, GradingScheme_Ofqual.Points, null AS L2Points
	FROM GradingScheme_Ofqual
	INNER JOIN EstActVA
	ON GradingScheme_Ofqual.OfqualGradingScheme = EstActVA.OfqualGradingScheme
	WHERE EstActVA.VA_Type = 'Ofqual Graded' AND EstActVA.ID = @EstactVAID
	ORDER BY GradingScheme_Ofqual.GradeNo
END
ELSE IF @va_type = 'NoGrade' BEGIN
	SELECT GradingScheme_NoGrade.ID, GradingScheme_NoGrade.Grade, GradingScheme_NoGrade.Points, null AS L2Points
	FROM   GradingScheme_NoGrade
	CROSS  JOIN EstActVA
	WHERE  EstActVA.VA_Type = 'NoGrade' AND EstActVA.ID = @EstactVAID
	AND    GradingScheme_NoGrade.Obsolete = 0  -- added v1.40.1
	ORDER BY GradingScheme_NoGrade.GradeNo
END

GO







-- ****************************************************************************************
--                                SYSTEM MAINT - STORED PROCEDURES
-- ****************************************************************************************


/****** Object:  StoredProcedure [dbo].[sp_WebPlus_SystemMaint_Select]    Script Date: 07/09/2025 12:55:13 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_WebPlus_SystemMaint_Select]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_WebPlus_SystemMaint_Select] AS' 
END
GO

ALTER PROCEDURE [dbo].[sp_WebPlus_SystemMaint_Select]
  @DataType    VARCHAR(50),
  @SelectRef   VARCHAR(50) = NULL,
  @SelectCargo VARCHAR(50) = NULL
AS
-- ============================================================================================
-- Author:		Andrew Breward
-- Create date: 25/09/2025 
-- Descripton:	SP to retrieve the System Maint data (specified by @DataType parameter)
--
-- Examples:    exec sp_WebPlus_SystemMaint_Select 'INYEARGRADES', '24/25'
--              exec sp_WebPlus_SystemMaint_Select 'INYEAREFFORTGRADES'
--              exec sp_WebPlus_SystemMaint_Select 'PASSFAILGRADES'
--              exec sp_WebPlus_SystemMaint_Select 'NOGRADEGRADES'
--              exec sp_WebPlus_SystemMaint_Select 'SETTINGVALUES'
--              exec sp_WebPlus_SystemMaint_Select 'SETTINGFLAGS'
--              exec sp_WebPlus_SystemMaint_Select 'USERDEFINEDFIELDS'
--
-- ============================================================================================

DECLARE @CourseID         INT = 0;
DECLARE @StudentID        INT = 0;
DECLARE @EnrolmentID      INT = 0;
DECLARE @GroupID          INT = 0;
DECLARE @ElementID        INT = 0;
DECLARE @GroupEnrolmentID INT = 0;
DECLARE @AcademicYearID   VARCHAR(5) = '';

IF (@DataType = 'INYEARGRADES')
BEGIN

	--AcademicYearID is passed as @SelectRef
	SET @AcademicYearID = @SelectRef;

	SELECT 
	  *
	FROM 
	  InYearGradeSetting
	WHERE
	  AcademicYearID = @AcademicYearID
	ORDER BY
	  InYearGradeID;

END
ELSE IF (@DataType = 'INYEAREFFORTGRADES')
BEGIN

	SELECT 
	  *
	FROM 
	  InYearGradeEffort
	ORDER BY
	  Description;

END
ELSE IF (@DataType = 'PASSFAILGRADES')
BEGIN

	SELECT 
	  *
	FROM 
	  UnGradedQualifications_PointsGrades
	ORDER BY
	  GradeNo;

END
ELSE IF (@DataType = 'NOGRADEGRADES')
BEGIN

	SELECT 
	  *
	FROM 
	  GradingScheme_NoGrade
	ORDER BY
	  GradeNo;

END
ELSE IF (@DataType = 'SETTINGVALUES')
BEGIN

	SELECT 
	  *
	FROM 
	  SystemSettingValue
	WHERE
		SystemSettingName LIKE 'WebPlus%'
	OR
		SystemSettingName LIKE 'Delta%'
	ORDER BY
	  SystemSettingName;

END
ELSE IF (@DataType = 'SETTINGFLAGS')
BEGIN

	SELECT 
	  *
	FROM 
	  SystemSettingFlag
	WHERE
		Category IN ('Web','Markbook') 
	OR
		SettingName like '%National colour coding%'
	ORDER BY
	  Category, SettingName;

END
ELSE IF (@DataType = 'USERDEFINEDFIELDS')
BEGIN

	SELECT 
	  *
	FROM 
	  UserDefinedFields
	ORDER BY
	  TableName, SystemName;

END

ELSE
BEGIN
	SELECT 'INVALID PARAMETER=' + @DataType AS ERROR_MSG
END

GO




/****** Object:  StoredProcedure [dbo].[sp_WebPlus_SystemMaintInYearGrade_Update]    Script Date: 07/09/2025 15:37:31 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_WebPlus_SystemMaintInYearGrade_Update]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_WebPlus_SystemMaintInYearGrade_Update] AS' 
END
GO

ALTER PROCEDURE [dbo].[sp_WebPlus_SystemMaintInYearGrade_Update]
  @StaffId        INT,
  @ID             INT,
  @InYearGradeID  INT,
  @Description    VARCHAR(35),
  @ShowByDefault  BIT,
  @IsEditable     BIT
AS
-- =======================================================================================
-- Author:		Andrew Breward
-- Create date: 07/09/2025 
-- Descripton:	SP to save the InYearGradeSetting data 
-- Example:     exec sp_WebPlus_SystemMaintInYearGrade_Update 2, 1,1, 'IY Grade1', 1, 1
-- =======================================================================================

SET NOCOUNT ON;

DECLARE  @VALUE_FALSE BIT = 0;
DECLARE  @VALUE_TRUE  BIT = 1;

DECLARE @RowcountReturn INT = 0;  -- default return value 0=no changes

DECLARE @Updated        DATETIME = GetDate();
DECLARE @ChangesToSave  BIT = @VALUE_FALSE;

DECLARE @UserName       VARCHAR(255);
DECLARE @UserForenames  VARCHAR(100);
DECLARE @UserSurname    VARCHAR(100);

DECLARE @RowDescription VARCHAR(500);
DECLARE @TypeOfChange   VARCHAR(50);

DECLARE @Description_Existing    VARCHAR(35);
DECLARE @ShowByDefault_Existing  BIT;
DECLARE @IsEditable_Existing     BIT;

DECLARE @ID_Existing                 INT;


IF EXISTS (SELECT 1 FROM Staff WHERE StaffID = @StaffId)
BEGIN
    --Get the Staff Username
    SELECT 
		@UserName = [User].UserName,
		@UserForenames = [User].Forenames,
		@UserSurname = [User].Surname
    FROM Staff 
		INNER JOIN [User] ON [User].UserID = Staff.UserID
    WHERE 
	    StaffID = @StaffId;

  IF EXISTS (SELECT 1 FROM InYearGradeSetting WHERE ID = @ID AND InYearGradeID = @InYearGradeID)
  BEGIN

    -- ********************************
    --   1) Update InYearGradeSetting
    -- ********************************
    SET @ChangesToSave = @VALUE_FALSE;

	--get the existing values
    SELECT
	  @Description_Existing   = InYearGradeDescription,
      @ShowByDefault_Existing = ShowByDefault,
	  @IsEditable_Existing    = IsEditable
    FROM
      InYearGradeSetting
    WHERE
      ID = @ID AND InYearGradeID = @InYearGradeID;

    --Check for Updates 
    IF IsNull(@Description,'') != IsNull(@Description_Existing,'')
      SET @ChangesToSave = @VALUE_TRUE;
    ELSE IF @ShowByDefault != @ShowByDefault_Existing
      SET @ChangesToSave = @VALUE_TRUE;
    ELSE IF @IsEditable != @IsEditable_Existing
      SET @ChangesToSave = @VALUE_TRUE;

	IF @ChangesToSave = @VALUE_TRUE
	BEGIN
      Print 'Performing Update';

      --Update changes
  	  UPDATE 
	    InYearGradeSetting
	  SET
	    InYearGradeDescription = @Description,
	    ShowByDefault          = @ShowByDefault,
		IsEditable             = @IsEditable
      WHERE
        ID = @ID AND InYearGradeID = @InYearGradeID;

      --set return to number of rows updated
      SET @RowcountReturn = 1;   -- @@ROWCOUNT;

	  --now update the Audit
	  SET @TypeOfChange    = 'UPDATE';
      SET @RowDescription  = 'Updated ID ' + Convert(VARCHAR, @ID);

      IF @Description != @Description_Existing BEGIN
		  INSERT INTO AuditTrail
			(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
		  VALUES
			(@Updated, @UserName, @TypeOfChange, 'InYearGradeSetting',  @ID,            @RowDescription,  'InYearGradeDescription', null,        null,   @Description_Existing,  @Description);
      END
      IF @ShowByDefault != @ShowByDefault_Existing BEGIN
		  INSERT INTO AuditTrail 
			(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,       OldValue, NewValue,  OldValueDescription, NewValueDescription)
		  VALUES
			(@Updated, @UserName, @TypeOfChange, 'InYearGradeSetting',  @ID,            @RowDescription,  'ShowByDefault', null,        null,   Convert(VARCHAR, @ShowByDefault_Existing),  Convert(VARCHAR, @ShowByDefault));
      END
      IF @IsEditable != @IsEditable_Existing BEGIN
		  INSERT INTO AuditTrail 
			(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,    OldValue, NewValue,  OldValueDescription, NewValueDescription)
		  VALUES
			(@Updated, @UserName, @TypeOfChange, 'InYearGradeSetting',  @ID,            @RowDescription,  'IsEditabe',  null,        null,   Convert(VARCHAR, @IsEditable_Existing),  Convert(VARCHAR, @IsEditable));
      END

	END
	  
  END  
  ELSE
  BEGIN
    Print 'ID not found';

    -- set return to -1 to indicate ID not found
    SET @RowcountReturn = -1;
  END
END   
ELSE
BEGIN
    Print 'StaffID not found';

    -- set return to -2 to indicate StaffID not found
    SET @RowcountReturn = -2;
END

--return number of rows updated (or -'ve error)
SELECT @RowcountReturn AS ReturnValue;
GO






/****** Object:  StoredProcedure [dbo].[sp_WebPlus_SystemMaintEffortGrade_Update]    Script Date: 10/09/2025 09:33:48 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_WebPlus_SystemMaintEffortGrade_Update]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_WebPlus_SystemMaintEffortGrade_Update] AS' 
END
GO


ALTER PROCEDURE [dbo].[sp_WebPlus_SystemMaintEffortGrade_Update]
  @StaffId        INT,
  @ID             INT,
  @Description    VARCHAR(35),
  @Obsolete       BIT
AS
-- =======================================================================================
-- Author:		Andrew Breward
-- Create date: 07/09/2025 
-- Descripton:	SP to save the Effort Grade Setting data 
-- Example:     exec sp_WebPlus_SystemMaintEffortGrade_Update 2, 1, 'Effort Grade1', 1
-- =======================================================================================

SET NOCOUNT ON;

DECLARE  @VALUE_FALSE BIT = 0;
DECLARE  @VALUE_TRUE  BIT = 1;

DECLARE @RowcountReturn INT = 0;  -- default return value 0=no changes

DECLARE @Updated        DATETIME = GetDate();
DECLARE @ChangesToSave  BIT = @VALUE_FALSE;

DECLARE @UserName       VARCHAR(255);
DECLARE @UserForenames  VARCHAR(100);
DECLARE @UserSurname    VARCHAR(100);

DECLARE @RowDescription VARCHAR(500);
DECLARE @TypeOfChange   VARCHAR(50);

DECLARE @Description_Existing    VARCHAR(35);
DECLARE @Obsolete_Existing       BIT;

DECLARE @ID_Existing             INT;
DECLARE @ID_New                  INT;


IF EXISTS (SELECT 1 FROM Staff WHERE StaffID = @StaffId)
BEGIN
    --Get the Staff Username
    SELECT 
		@UserName = [User].UserName,
		@UserForenames = [User].Forenames,
		@UserSurname = [User].Surname
    FROM Staff 
		INNER JOIN [User] ON [User].UserID = Staff.UserID
    WHERE 
	    StaffID = @StaffId;

  IF @ID <= 0 
  BEGIN
    -- ********************************
    --   1) Create InYearGradeEffort
    -- ********************************

  	  INSERT INTO 
	    InYearGradeEffort (Description, Obsolete)
	  VALUES
	    (@Description, @Obsolete);

      --get the new ID
	  SELECT @ID_New = SCOPE_IDENTITY();

      --set return to number of rows updated
      SET @RowcountReturn = 1;   

	  --now update the Audit
	  SET @TypeOfChange    = 'INSERT';
      SET @RowDescription  = 'Inserted ID ' + Convert(VARCHAR, @ID_New);

  	  INSERT INTO AuditTrail
		(AuditDate, AuditBy,   AuditChange,   TableName,           RowID,      RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
	  VALUES
		(@Updated, @UserName, @TypeOfChange, 'InYearGradeEffort',  @ID_New,   @RowDescription,  'Description', null,        null,   null,  @Description);

	  INSERT INTO AuditTrail 
		(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,    RowDescription,  FieldName,    OldValue, NewValue,  OldValueDescription, NewValueDescription)
	  VALUES
		(@Updated, @UserName, @TypeOfChange, 'InYearGradeEffort',  @ID_New,   @RowDescription,  'Obsolete',  null,        null,   null,  Convert(VARCHAR, @Obsolete));

  END
  ELSE
  BEGIN
    -- ********************************
    --   2) Update InYearGradeEffort
    -- ********************************
    SET @ChangesToSave = @VALUE_FALSE;

	--get the existing values
    SELECT
	  @Description_Existing   = Description,
      @Obsolete_Existing      = Obsolete
    FROM
      InYearGradeEffort
    WHERE
      ID = @ID;

    --Check for Updates 
    IF IsNull(@Description,'') != IsNull(@Description_Existing,'')
      SET @ChangesToSave = @VALUE_TRUE;
    ELSE IF @Obsolete != @Obsolete_Existing
      SET @ChangesToSave = @VALUE_TRUE;

	IF @ChangesToSave = @VALUE_TRUE
	BEGIN
      Print 'Performing Update';

      --Update changes
  	  UPDATE 
	    InYearGradeEffort
	  SET
	    Description = @Description,
		Obsolete    = @Obsolete
      WHERE
        ID = @ID;

      --set return to number of rows updated
      SET @RowcountReturn = 1;   -- @@ROWCOUNT;

	  --now update the Audit
	  SET @TypeOfChange    = 'UPDATE';
      SET @RowDescription  = 'Updated ID ' + Convert(VARCHAR, @ID);

      IF @Description != @Description_Existing BEGIN
		  INSERT INTO AuditTrail
			(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
		  VALUES
			(@Updated, @UserName, @TypeOfChange, 'InYearGradeEffort',  @ID,            @RowDescription,  'Description', null,        null,   @Description_Existing,  @Description);
      END
      IF @Obsolete != @Obsolete_Existing BEGIN
		  INSERT INTO AuditTrail 
			(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,    OldValue, NewValue,  OldValueDescription, NewValueDescription)
		  VALUES
			(@Updated, @UserName, @TypeOfChange, 'InYearGradeEffort',  @ID,            @RowDescription,  'Obsolete',  null,        null,   Convert(VARCHAR, @Obsolete_Existing),  Convert(VARCHAR, @Obsolete));
      END

	END
	  
  END  

END   
ELSE
BEGIN
    Print 'StaffID not found';

    -- set return to -2 to indicate StaffID not found
    SET @RowcountReturn = -2;
END

--return number of rows updated (or -'ve error)
SELECT @RowcountReturn AS ReturnValue;
GO




-- ****************************************************************************************
--                       SQL Server 2014 Compatibililty
-- ****************************************************************************************

ALTER PROCEDURE [dbo].[sp_WebPlus_MarkBook_SaveMarkbookGrade]
    @Type NVARCHAR(50),
    @Value NVARCHAR(MAX),
    @UpdatedBy NVARCHAR(50),
    @UpdatedByUserID int,
    @GroupID INT,
    @EnrolmentID INT,
    @ElementID INT,
	@OGP_EnrolmentElementID_Output INT OUTPUT 
AS
BEGIN
    DECLARE @OGP_GroupElementID INT;
    DECLARE @DateValue DATETIME;
    DECLARE @CompleteValue INT;
    DECLARE @userdefinedcheck1 INT;
    DECLARE @userdefinedcheck2 INT;
    DECLARE @OGP_EnrolmentElementID INT;
	DECLARE @Now DATETIME = dbo.UKLocalTimeFromUtc(GETUTCDATE());
	
    -- Get Group Element ID
    SELECT @OGP_GroupElementID = ID
    FROM OGP_GroupElement
    WHERE OGP_ElementID = @ElementID AND OGP_GroupID = @GroupID;

    -- Check if Element ID and Enrolment ID exist
    IF @ElementID IS NULL OR @EnrolmentID IS NULL OR @OGP_GroupElementID IS NULL
    BEGIN
        -- Error handling
        RETURN;
    END

    IF @Type = 'complete'
    BEGIN
        SET @CompleteValue = CASE WHEN @Value IN ('True', 'true', '1') THEN 1 ELSE 0 END;
    END;

	  IF @Type = 'userdefinedcheck1'
    BEGIN
        SET @userdefinedcheck1 = CASE WHEN @Value IN ('True', 'true', '1') THEN 1 ELSE 0 END;
    END;

	  IF @Type = 'userdefinedcheck2'
    BEGIN
        SET @userdefinedcheck2 = CASE WHEN @Value IN ('True', 'true', '1') THEN 1 ELSE 0 END;
    END;

    -- Check if the row exists in OGP_EnrolmentElement
    IF NOT EXISTS (SELECT 1 
                   FROM OGP_EnrolmentElement 
                   WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID)
    BEGIN
        -- Row does not exist, perform insert with minimal data
        INSERT INTO OGP_EnrolmentElement (OGP_ElementID, OGP_EnrolmentID, UpdatedBy, UpdatedByUserID, UpdatedWhen)
        VALUES (@ElementID, @EnrolmentID, @UpdatedBy, @UpdatedByUserID , @Now);

        -- Get the newly inserted OGP_EnrolmentElement ID
        SELECT @OGP_EnrolmentElementID = SCOPE_IDENTITY();

    END

    BEGIN
        -- Row always exists as create before, get the OGP_EnrolmentElement ID
        SELECT @OGP_EnrolmentElementID = ID 
        FROM OGP_EnrolmentElement 
        WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;

        -- Perform update
        IF @Type = 'complete'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET Complete = @CompleteValue, UpdatedBy = @UpdatedBy, UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
        ELSE IF @Type = 'grade'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET Grade = @Value, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
        ELSE IF @Type = 'points'
        BEGIN
			IF @Value = ''
				SET @Value = NULL;

            UPDATE OGP_EnrolmentElement
            SET Points = @Value, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
        ELSE IF @Type = 'comment'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET Comment = @Value, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END

		ELSE IF @Type = 'userdefinedstringshort1'--'shortstring1'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET UserDefinedStringShort1 = @Value, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
		ELSE IF @Type = 'userdefinedstringshort2'--'shortstring2'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET UserDefinedStringShort2 = @Value, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
		ELSE IF @Type = 'userdefinedstringlong1'--'longstring1'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET UserDefinedStringLong1 = @Value, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
		ELSE IF @Type = 'userdefinedstringlong2'--'longstring2'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET UserDefinedStringLong2 = @Value, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
		ELSE IF @Type = 'userdefinedcheck1'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET UserDefinedCheck1 = @userdefinedcheck1, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
		ELSE IF @Type = 'userdefinedcheck2'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET UserDefinedCheck2 = @userdefinedcheck2, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
		ELSE IF @Type = 'userdefinednumeric1'
        BEGIN
			IF @Value = ''
				SET @Value = NULL;

            UPDATE OGP_EnrolmentElement
            SET UserDefinedNumeric1 = @Value, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
		ELSE IF @Type = 'userdefinednumeric2'
        BEGIN
			IF @Value = ''
				SET @Value = NULL;

            UPDATE OGP_EnrolmentElement
            SET UserDefinedNumeric2 = @Value, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
        ELSE IF @Type = 'feedbackstudent'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET feedbackstudent = @Value, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
        
    END

    -- Handle date updates
    IF @Type IN ('datesubmitted', 'dateexpected', 'datemarked', 'dateresub', 'dateresubmarked', 'dateset','userdefineddate1','userdefineddate2',
    'feedbackstudentdateupdated')
    BEGIN
        IF @Value IS NULL OR @Value = ''
        BEGIN
            SET @DateValue = NULL;
        END
        ELSE
        BEGIN
            SET @DateValue = CONVERT(DATETIME, @Value, 3); -- Convert the string to datetime. 3= '13/01/24'
        END

        IF @Type = 'datesubmitted'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET DateSubmitted = @DateValue, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
        ELSE IF @Type = 'dateexpected'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET DateExpected = @DateValue, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
        ELSE IF @Type = 'datemarked'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET DateMarked = @DateValue, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
        ELSE IF @Type IN ('dateresub', 'dateresubmarked')
        BEGIN
            -- Check if the row exists in OGP_EnrolmentElementResubmission
            IF NOT EXISTS (SELECT 1 
                           FROM OGP_EnrolmentElementResubmission eer
                           WHERE eer.OGP_EnrolmentElementID = @OGP_EnrolmentElementID)
            BEGIN
                -- Insert new row into OGP_EnrolmentElementResubmission
                INSERT INTO OGP_EnrolmentElementResubmission (OGP_EnrolmentElementID, DateSubmitted, DateMarked, UpdatedBy,UpdatedByUserID, UpdatedWhen)
                VALUES (@OGP_EnrolmentElementID, 
                        CASE WHEN @Type = 'dateresub' THEN @DateValue ELSE NULL END,
                        CASE WHEN @Type = 'dateresubmarked' THEN @DateValue ELSE NULL END,
                        @UpdatedBy,
                        @UpdatedByUserID,
                        @Now);
            END
            ELSE
            BEGIN
                -- Row exists, perform update
                IF @Type = 'dateresub'
                BEGIN
                    UPDATE eer
                    SET eer.DateSubmitted = @DateValue, eer.UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, eer.UpdatedWhen = @Now
                    FROM OGP_EnrolmentElementResubmission eer
                    WHERE eer.OGP_EnrolmentElementID = @OGP_EnrolmentElementID;
                END
                ELSE IF @Type = 'dateresubmarked'
                BEGIN
                    UPDATE eer
                    SET eer.DateMarked = @DateValue, eer.UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, eer.UpdatedWhen = @Now
                    FROM OGP_EnrolmentElementResubmission eer
                    WHERE eer.OGP_EnrolmentElementID = @OGP_EnrolmentElementID;
                END
            END
        END
        ELSE IF @Type = 'dateset'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET DateSet = @DateValue, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
		ELSE IF @Type = 'userdefineddate2'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET UserDefinedDate2 = @DateValue, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
		ELSE IF @Type = 'userdefineddate1'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET UserDefinedDate1 = @DateValue, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
        ELSE IF @Type = 'feedbackstudentdateupdated'
        BEGIN
            UPDATE OGP_EnrolmentElement
            SET feedbackstudentdateupdated = @DateValue, UpdatedBy = @UpdatedBy,UpdatedByUserID = @UpdatedByUserID, UpdatedWhen = @Now
            WHERE OGP_ElementID = @ElementID AND OGP_EnrolmentID = @EnrolmentID;
        END
    END

	    SET @OGP_EnrolmentElementID_Output = @OGP_EnrolmentElementID;
END;
GO


ALTER PROCEDURE [dbo].[sp_WebPlus_MarkBook_GetMarkbookTree]
    @GroupID INT,
    @GetRelatedGroups BIT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @CurrentYearStart INT, @CurrentYearEnd INT;

    -- Parse @CurrentYear to integers for comparison
    SELECT TOP 1 
        @CurrentYearStart = CAST(LEFT(AcademicYearID, 2) AS INT),
        @CurrentYearEnd   = CAST(RIGHT(AcademicYearID, 2) AS INT)
    FROM OGP_Group
    WHERE ID = @GroupID;

    IF @CurrentYearStart IS NULL OR @CurrentYearEnd IS NULL
    BEGIN
        RAISERROR('Invalid or missing AcademicYearID for the provided GroupID.', 16, 1);
        RETURN;
    END;

    ;WITH CriteriaCTE AS (
        SELECT
            E2.DirectParentID,
            E2.ElementCode,
            E2.ID,
            E2.[Description],
            E2.OrderBy
        FROM OGP_Element E2
        INNER JOIN OGP_ElementType ET2 ON E2.OGP_ElementTypeID = ET2.ID
        INNER JOIN dbo.OGP_GroupElement GE ON GE.OGP_ElementID = E2.ID
                                          AND GE.OGP_GroupID   = @GroupID
        WHERE ET2.ID = 3
          AND E2.Recordstatus <> 'Obsolete'
    ),
    RelatedGroupsCTE AS (
        SELECT
            RG.OGP_GroupID        AS GroupID,
            RG.OGP_RelatedGroupID AS RelatedGroupID,
            G.AcademicYearID
        FROM OGP_RelatedGroup RG
        INNER JOIN OGP_Group G ON RG.OGP_RelatedGroupID = G.ID
        WHERE CAST(LEFT(G.AcademicYearID, 2) AS INT)  < @CurrentYearStart
          AND CAST(RIGHT(G.AcademicYearID, 2) AS INT) < @CurrentYearEnd
          AND RG.OGP_GroupID = @GroupID
          AND EXISTS (SELECT 1 FROM OGP_GroupElement GE WHERE GE.OGP_GroupID = RG.OGP_RelatedGroupID)
          AND EXISTS (
                SELECT 1
                FROM OGP_GroupEnrolment ge1
                INNER JOIN OGP_Enrolment e1 ON ge1.OGP_EnrolmentID = e1.ID
                INNER JOIN OGP_Enrolment e2 ON e2.StudentRef       = e1.StudentRef
                INNER JOIN OGP_GroupEnrolment ge2 ON ge2.OGP_EnrolmentID = e2.ID
                WHERE ge1.OGP_GroupID = @GroupID
                  AND ge2.OGP_GroupID = RG.OGP_RelatedGroupID
                  AND @GetRelatedGroups = 1
          )
    ),
    CriteriaRelatedCTE AS ( -- only gets relevant related group criteria
        SELECT
            E2.DirectParentID,
            E2.ElementCode,
            E2.ID,
            E2.[Description],
            E2.OrderBy
        FROM OGP_Element E2
        INNER JOIN OGP_ElementType ET2 ON E2.OGP_ElementTypeID = ET2.ID
        INNER JOIN dbo.OGP_GroupElement GE ON GE.OGP_ElementID = E2.ID
        WHERE GE.OGP_GroupID IN (SELECT RelatedGroupID FROM RelatedGroupsCTE)
          AND E2.Recordstatus <> 'Obsolete'
          AND @GetRelatedGroups = 1
    ),
    OriginalGroups AS (
        SELECT
            E.ID            AS ElementID,
            E.ElementCode,
            ET.ID           AS ElementTypeID,
            E.[Description] AS ElementDescription,
            E.DirectParentID AS ParentElementID,
            ParentE.ElementCode AS ParentElementCode,
            STUFF((
                SELECT ', ' + C.ElementCode
                FROM CriteriaCTE C
                WHERE C.DirectParentID = E.ID
                ORDER BY C.OrderBy
                FOR XML PATH(''), TYPE
            ).value('.','NVARCHAR(MAX)'),1,2,'') AS ChildCriteriaCodes,
            STUFF((
                SELECT ', ' + CAST(C.ID AS VARCHAR(10))
                FROM CriteriaCTE C
                WHERE C.DirectParentID = E.ID
                ORDER BY C.OrderBy
                FOR XML PATH(''), TYPE
            ).value('.','NVARCHAR(MAX)'),1,2,'') AS ChildCriteriaIDs,

            -- JSON (SQL 2014-compatible emulation of FOR JSON PATH)
            ISNULL((
                SELECT '[' +
                    STUFF((
                        SELECT ',' + (
                            SELECT
                                '{' +
                                '"ID":' + CAST(C.ID AS NVARCHAR(20)) + ',' +
                                '"ElementCode":"' + REPLACE(REPLACE(ISNULL(C.ElementCode,''), '\','\\'), '"','\"') + '",' +
                                '"Description":"' + REPLACE(REPLACE(ISNULL(C.[Description],''), '\','\\'), '"','\"') + '"' +
                                '}'
                            FOR XML PATH(''), TYPE
                        ).value('.','NVARCHAR(MAX)')
                        FROM CriteriaCTE C
                        WHERE C.DirectParentID = E.ID
                        ORDER BY C.OrderBy
                        FOR XML PATH(''), TYPE
                    ).value('.','NVARCHAR(MAX)'),1,1,'')
                + ']'
            ), '[]') AS ChildCriteriaJSON,

            CAST(0 AS BIT) AS IsRelatedGroup,
            E.OrderBy,
            GE.OGP_GroupID,         -- for debugging
            NULL        AS RelatedGroupID,
            E.OutOfPoints,
            E.Size      AS ElementSize,
            L.ElementLevelName,
            NULL        AS RelatedAcadYr
        FROM OGP_Element E
        INNER JOIN OGP_ElementType ET ON E.OGP_ElementTypeID = ET.ID
        LEFT  JOIN OGP_Element ParentE ON E.DirectParentID = ParentE.ID
        LEFT  JOIN OGP_GroupElement GE ON E.ID = GE.OGP_ElementID
        LEFT  JOIN OGP_Element_Level L ON L.ID = E.OGP_ElementLevelID
        WHERE ET.ID <> 3     -- 3 is criteria
          AND GE.OGP_GroupID = @GroupID
          AND E.Recordstatus <> 'Obsolete'
    ),
    RelatedGroups AS (
        SELECT
            E.ID            AS ElementID,
            E.ElementCode,
            ET.ID           AS ElementTypeID,
            E.[Description] AS ElementDescription,
            E.DirectParentID AS ParentElementID,
            ParentE.ElementCode AS ParentElementCode,
            STUFF((
                SELECT ', ' + C.ElementCode
                FROM CriteriaRelatedCTE C
                WHERE C.DirectParentID = E.ID
                ORDER BY C.OrderBy
                FOR XML PATH(''), TYPE
            ).value('.','NVARCHAR(MAX)'),1,2,'') AS ChildCriteriaCodes,
            STUFF((
                SELECT ', ' + CAST(C.ID AS VARCHAR(10))
                FROM CriteriaRelatedCTE C
                WHERE C.DirectParentID = E.ID
                ORDER BY C.OrderBy
                FOR XML PATH(''), TYPE
            ).value('.','NVARCHAR(MAX)'),1,2,'') AS ChildCriteriaIDs,

            -- JSON (SQL 2014-compatible emulation)
            ISNULL((
                SELECT '[' +
                    STUFF((
                        SELECT ',' + (
                            SELECT
                                '{' +
                                '"ID":' + CAST(C.ID AS NVARCHAR(20)) + ',' +
                                '"ElementCode":"' + REPLACE(REPLACE(ISNULL(C.ElementCode,''), '\','\\'), '"','\"') + '",' +
                                '"Description":"' + REPLACE(REPLACE(ISNULL(C.[Description],''), '\','\\'), '"','\"') + '"' +
                                '}'
                            FOR XML PATH(''), TYPE
                        ).value('.','NVARCHAR(MAX)')
                        FROM CriteriaRelatedCTE C
                        WHERE C.DirectParentID = E.ID
                        ORDER BY C.OrderBy
                        FOR XML PATH(''), TYPE
                    ).value('.','NVARCHAR(MAX)'),1,1,'')
                + ']'
            ), '[]') AS ChildCriteriaJSON,

            CAST(1 AS BIT) AS IsRelatedGroup,
            E.OrderBy,
            GE.OGP_GroupID,          -- for debugging
            RG.GroupID AS RelatedGroupID,
            E.OutOfPoints,
            E.Size      AS ElementSize,
            L.ElementLevelName,
            RG.AcademicYearID AS RelatedAcadYr
        FROM OGP_Element E
        INNER JOIN OGP_ElementType ET ON E.OGP_ElementTypeID = ET.ID
        LEFT  JOIN OGP_Element ParentE ON E.DirectParentID = ParentE.ID
        LEFT  JOIN OGP_GroupElement GE ON E.ID = GE.OGP_ElementID
        LEFT  JOIN RelatedGroupsCTE RG ON RG.RelatedGroupID = GE.OGP_GroupID
        LEFT  JOIN OGP_Element_Level L ON L.ID = E.OGP_ElementLevelID
        WHERE ET.ID <> 3            -- 3 is criteria
          AND RG.RelatedGroupID IS NOT NULL
          AND @GetRelatedGroups = 1
          AND E.Recordstatus <> 'Obsolete'
    )
    SELECT *
    FROM OriginalGroups
    UNION ALL
    SELECT *
    FROM RelatedGroups
    ORDER BY RelatedGroupID DESC, OrderBy, ParentElementCode, ElementCode;
END;
GO

ALTER PROCEDURE sp_WebPlus_Markbook_EnrolmentElementResubUpdateCopy
    @EnrolmentElementId INT,

	--audit
	@UpdatedBy NVARCHAR(50),
    @UpdatedByUserID INT,

    @Complete BIT,
    @Grade VARCHAR(12),
    @Points DECIMAL(19, 2),    
    @Comment VARCHAR(512),
    @UserDefinedStringShort1 NVARCHAR(50),
    @UserDefinedStringShort2 NVARCHAR(50),
    @UserDefinedStringLong1 NVARCHAR(MAX),
    @UserDefinedStringLong2 NVARCHAR(MAX),
    @UserDefinedCheck1 BIT,
    @UserDefinedCheck2 BIT,
    @UserDefinedNumeric1 DECIMAL(19, 2),
    @UserDefinedNumeric2 DECIMAL(19, 2),

	--Dates
    @DateExpected DATETIME,
    @DateSubmitted DATETIME,
	@DateSet DATETIME,
	@UserDefinedDate1 DATETIME,
    @UserDefinedDate2 DATETIME,
	@DateMarked DATETIME,
    @FeedbackStudent NVARCHAR(MAX),
    @FeedbackStudentDateUpdated DATETIME
AS
BEGIN
    BEGIN TRY
        BEGIN TRANSACTION;

        -- Insert the current row from OGP_EnrolmentElement into OGP_EnrolmentElementResubmission
        INSERT INTO [OGP_EnrolmentElementResubmission] (
            [OGP_EnrolmentElementID], [Complete], [Grade], [Points], [DateMarked], [Comment], 
            [UpdatedBy], [UpdatedByUserID], [UpdatedWhen], [DateSubmitted], 
            [UserDefinedDate1], [UserDefinedDate2],
            [UserDefinedStringShort1], [UserDefinedStringShort2], [UserDefinedStringLong1], 
            [UserDefinedStringLong2],
            [UserDefinedCheck1], [UserDefinedCheck2], [UserDefinedNumeric1], 
            [UserDefinedNumeric2],
            DateExpected,DateSet,
            FeedbackStudent,
            FeedbackStudentDateUpdated
        )
        SELECT 
            [ID], [Complete], [Grade], [Points], [DateMarked], [Comment],
            [UpdatedBy], [UpdatedByUserID], [UpdatedWhen], [DateSubmitted],
            [UserDefinedDate1], [UserDefinedDate2],
            [UserDefinedStringShort1], [UserDefinedStringShort2], [UserDefinedStringLong1], [UserDefinedStringLong2],
            [UserDefinedCheck1], [UserDefinedCheck2], [UserDefinedNumeric1], [UserDefinedNumeric2],DateExpected,DateSet,
            FeedbackStudent,
            FeedbackStudentDateUpdated
        FROM [OGP_EnrolmentElement]
        WHERE [ID] = @EnrolmentElementId;

        -- Update the row in the OGP_EnrolmentElement table
        UPDATE [OGP_EnrolmentElement]
        SET [Complete] = @Complete,
            [Grade] = @Grade,
            [Points] = @Points,
            [DateMarked] = @DateMarked,
            [Comment] = @Comment,
            [UpdatedBy] = @UpdatedBy,
            [UpdatedByUserID] = @UpdatedByUserID,
            [UpdatedWhen] = dbo.UKLocalTimeFromUtc(GETUTCDATE()),
            [UserDefinedDate1] = @UserDefinedDate1,
            [UserDefinedDate2] = @UserDefinedDate2,
            [UserDefinedStringShort1] = @UserDefinedStringShort1,
            [UserDefinedStringShort2] = @UserDefinedStringShort2,
            [UserDefinedStringLong1] = @UserDefinedStringLong1,
            [UserDefinedStringLong2] = @UserDefinedStringLong2,
            [UserDefinedCheck1] = @UserDefinedCheck1,
            [UserDefinedCheck2] = @UserDefinedCheck2,
            [UserDefinedNumeric1] = @UserDefinedNumeric1,
            [UserDefinedNumeric2] = @UserDefinedNumeric2,
			DateSubmitted = @DateSubmitted,
			DateExpected = @DateExpected,
			DateSet = @DateSet,
            FeedbackStudent = @FeedbackStudent,
            FeedbackStudentDateUpdated = @FeedbackStudentDateUpdated
        WHERE [ID] = @EnrolmentElementId;

        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
        BEGIN
            ROLLBACK TRANSACTION;
        END;

        -- Raise the error to the caller
        DECLARE @ErrorMessage NVARCHAR(4000), @ErrorSeverity INT, @ErrorState INT;
        SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE();
        RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
    END CATCH
END;
GO


/****** Object:  StoredProcedure [dbo].[sp_WebPlus_MarkBook_GetMarkbookData]    Script Date: 10/09/2025 13:31:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_WebPlus_MarkBook_GetMarkbookData]
    @GroupID INT,
    @GetRelatedGroups BIT
AS

--Modified AMG 23/06/2025
--Added AND ISNULL((SELECT TOP(1) O.RecordStatus FROM OGP_Enrolment O WHERE O.OriginalCourseID = OGP_Enrolment.OriginalCourseID AND O.OGP_StudentID = OGP_Enrolment.OGP_StudentID AND O.RecordStatus = 'Obsolete'),'') <> 'Obsolete'--AMG 23/06/2025
--We don't want to show obsolete enrolments in Adhoc Groups

BEGIN
    SET NOCOUNT ON;

    DECLARE @CurrentYearStart INT, @CurrentYearEnd INT;

    -- Get current academic year details
    SELECT TOP 1 
        @CurrentYearStart = CAST(LEFT(AcademicYearID, 2) AS INT),
        @CurrentYearEnd = CAST(RIGHT(AcademicYearID, 2) AS INT)
    FROM OGP_Group
    WHERE ID = @GroupID;

    IF @CurrentYearStart IS NULL OR @CurrentYearEnd IS NULL
    BEGIN
        RAISERROR ('Invalid or missing AcademicYearID for the provided GroupID.', 16, 1);
        RETURN;
    END;

    ;WITH RelatedGroupsCTE AS (
        SELECT
            RG.OGP_RelatedGroupID AS RelatedGroupID,--do we want to check the other way around?
            CAST(LEFT(G.AcademicYearID, 2) AS INT) AS AcademicYearStart,
            CAST(RIGHT(G.AcademicYearID, 2) AS INT) AS AcademicYearEnd
        FROM
            OGP_RelatedGroup RG
            INNER JOIN OGP_Group G ON RG.OGP_RelatedGroupID = G.ID
        WHERE
            CAST(LEFT(G.AcademicYearID, 2) AS INT) < @CurrentYearStart AND 
            CAST(RIGHT(G.AcademicYearID, 2) AS INT) < @CurrentYearEnd AND
			RG.OGP_GroupID = @GroupID AND 
			EXISTS (SELECT 1 FROM OGP_GroupElement GE WHERE GE.OGP_GroupID = RG.OGP_RelatedGroupID) AND
			@GetRelatedGroups = 1
    ),
    OriginalGroups AS (--if you update the logic to this Common Table Expression OriginalGroups then RelatedGroups CTE logic also needs updating
        SELECT
            OGP_Element.[ID] AS ElementID,
            OGP_Element.[ElementCode],
            OGP_GroupEnrolment.[OGP_EnrolmentID] AS EnrolmentID,
            OGP_Enrolment.[StudentRef],
            s.[Forenames],
            s.[Surname],
            CASE
                WHEN t.[DoesNotDoElement] = 1 THEN CAST(1 AS BIT)
                ELSE CAST(ISNULL(EE.[DoesNotDoElement], 0) AS BIT)
            END AS [DoesNotDoElement],
            EE.[Grade],
            EE.[Points],
            EE.[Complete],
			CASE
                WHEN ee.DateSet IS NOT NULL THEN ee.DateSet
                ELSE OGP_GroupElement.DateSet
            END AS [DateSet],
			CASE
                WHEN ee.[DateExpected] IS NOT NULL THEN ee.[DateExpected]
                ELSE OGP_GroupElement.DateExpected
            END AS [DateExpected],
            EE.[DateMarked],
            EE.[Comment],
            EE.[DateSubmitted],
            EE.[UserDefinedDate1],
            EE.[UserDefinedDate2],
            EE.[UserDefinedStringShort1],
            EE.[UserDefinedStringShort2],
            EE.[UserDefinedStringLong1],
            EE.[UserDefinedStringLong2],
            EE.[UserDefinedCheck1],
            EE.[UserDefinedCheck2],
            EE.[UserDefinedNumeric1],
            EE.[UserDefinedNumeric2],
            ET.ID AS ElementType,
            CASE
                WHEN OGP_ElementTopParent.[ElementCode] IS NULL THEN OGP_Element.[ElementCode]
                ELSE OGP_ElementTopParent.[ElementCode]
            END AS [TopLevelElementCode],
		   ISNULL(
					(SELECT COUNT(DISTINCT resub.ID)
					 FROM [OGP_EnrolmentElementResubmission] resub
					 WHERE resub.OGP_EnrolmentElementID = EE.ID), 0
				) AS ResubmissionCount,
	        EE.UpdatedByUserID,
	        EE.UpdatedBy,
            EE.ID as EnrolmentElementID,
            CAST(0 AS BIT) AS IsRelatedGroup, -- Flag for original group
            c.[Description] as CompletionDescription,
			OGP_GroupEnrolment.OGP_GroupID as GroupId,
			ee.FeedbackStudent,
			ee.FeedbackStudentDateUpdated
        FROM
            OGP_GroupEnrolment
            INNER JOIN OGP_Enrolment ON OGP_Enrolment.ID = OGP_GroupEnrolment.OGP_EnrolmentID
            INNER JOIN Completion c ON c.id = OGP_Enrolment.OverallCompletionID
            INNER JOIN OGP_Student s ON s.ID = OGP_Enrolment.OGP_StudentID
            INNER JOIN OGP_GroupElement ON OGP_GroupElement.OGP_GroupID = OGP_GroupEnrolment.OGP_GroupID
            INNER JOIN OGP_Element ON OGP_Element.ID = OGP_GroupElement.OGP_ElementID
            INNER JOIN OGP_ElementType ET ON OGP_Element.OGP_ElementTypeID = ET.ID
            LEFT JOIN OGP_Element OGP_ElementDirectParent ON OGP_ElementDirectParent.ID = OGP_Element.DirectParentID
            LEFT JOIN OGP_Element OGP_ElementTopParent ON OGP_ElementTopParent.ID = OGP_Element.TopLevelParentID
            LEFT JOIN OGP_EnrolmentElement EE ON OGP_Enrolment.ID = EE.OGP_EnrolmentID AND OGP_Element.ID = EE.OGP_ElementID
            LEFT JOIN (
                SELECT OGP_Element.ID AS OGP_ElementID, EE1.OGP_EnrolmentID, 1 AS DoesNotDoElement
                FROM OGP_Element 
                INNER JOIN OGP_EnrolmentElement EE1 ON OGP_Element.TopLevelParentID = EE1.OGP_ElementID AND EE1.DoesNotDoElement = 1
                INNER JOIN OGP_GroupElement ON OGP_GroupElement.OGP_ElementID = EE1.OGP_ElementID AND OGP_GroupElement.OGP_GroupID = @GroupID
                INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = EE1.OGP_EnrolmentID
                UNION
                SELECT OGP_Element.ID AS OGP_ElementID, EE2.OGP_EnrolmentID, 1 AS DoesNotDoElement
                FROM OGP_Element 
                INNER JOIN OGP_EnrolmentElement EE2 ON OGP_Element.DirectParentID = EE2.OGP_ElementID AND EE2.DoesNotDoElement = 1
                INNER JOIN OGP_GroupElement ON OGP_GroupElement.OGP_ElementID = EE2.OGP_ElementID AND OGP_GroupElement.OGP_GroupID = @GroupID
                INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = EE2.OGP_EnrolmentID
                UNION
                SELECT EE3.OGP_ElementID AS OGP_ElementID, EE3.OGP_EnrolmentID, 1 AS DoesNotDoElement
                FROM OGP_EnrolmentElement EE3
                INNER JOIN OGP_GroupElement ON OGP_GroupElement.OGP_ElementID = EE3.OGP_ElementID AND OGP_GroupElement.OGP_GroupID = @GroupID
                INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = EE3.OGP_EnrolmentID
                AND EE3.DoesNotDoElement = 1
            ) t ON t.OGP_ElementID = OGP_Element.ID AND t.OGP_EnrolmentID = OGP_GroupEnrolment.OGP_EnrolmentID
        WHERE
            OGP_GroupEnrolment.OGP_GroupID = @GroupID and 
            OGP_Enrolment.RecordStatus <> 'Obsolete'
			AND ISNULL((SELECT TOP(1) O.RecordStatus FROM OGP_Enrolment O WHERE O.OriginalCourseID = OGP_Enrolment.OriginalCourseID AND O.OGP_StudentID = OGP_Enrolment.OGP_StudentID AND O.RecordStatus = 'Obsolete'),'') <> 'Obsolete'--AMG 23/06/2025
    ),
    RelatedGroups AS (--if you update the logic to this Common Table Expression RelatedGroups then OriginalGroups CTE logic also needs updating
           SELECT
            OGP_Element.[ID] AS ElementID,
            OGP_Element.[ElementCode],
            OGP_GroupEnrolment.[OGP_EnrolmentID] AS EnrolmentID,
            OGP_Enrolment.[StudentRef],
            s.[Forenames],
            s.[Surname],
            CASE
                WHEN t.[DoesNotDoElement] = 1 THEN CAST(1 AS BIT)
                ELSE CAST(ISNULL(EE.[DoesNotDoElement], 0) AS BIT)
            END AS [DoesNotDoElement],
            EE.[Grade],
            EE.[Points],
            EE.[Complete],
			CASE
                WHEN ee.DateSet IS NOT NULL THEN ee.DateSet
                ELSE OGP_GroupElement.DateSet
            END AS [DateSet],
			CASE
                WHEN ee.[DateExpected] IS NOT NULL THEN ee.[DateExpected]
                ELSE OGP_GroupElement.DateExpected
            END AS [DateExpected],
            EE.[DateMarked],
            EE.[Comment],
            EE.[DateSubmitted],
            EE.[UserDefinedDate1],
            EE.[UserDefinedDate2],
            EE.[UserDefinedStringShort1],
            EE.[UserDefinedStringShort2],
            EE.[UserDefinedStringLong1],
            EE.[UserDefinedStringLong2],
            EE.[UserDefinedCheck1],
            EE.[UserDefinedCheck2],
            EE.[UserDefinedNumeric1],
            EE.[UserDefinedNumeric2],
            ET.ID AS ElementType,
            CASE
                WHEN OGP_ElementTopParent.[ElementCode] IS NULL THEN OGP_Element.[ElementCode]
                ELSE OGP_ElementTopParent.[ElementCode]
            END AS [TopLevelElementCode],
			ISNULL(
					(SELECT COUNT(DISTINCT resub.ID)
					 FROM [OGP_EnrolmentElementResubmission] resub
					 WHERE resub.OGP_EnrolmentElementID = EE.ID), 0
				) AS ResubmissionCount,
	        EE.UpdatedByUserID,
	        EE.UpdatedBy,
            EE.ID as EnrolmentElementID,
            CAST(1 AS BIT) AS IsRelatedGroup, -- Flag for original group
            c.[Description] as CompletionDescription,
			OGP_GroupEnrolment.OGP_GroupID as GroupId,
			ee.FeedbackStudent,
			ee.FeedbackStudentDateUpdated
        FROM
            OGP_GroupEnrolment
			INNER JOIN RelatedGroupsCTE RG ON RG.RelatedGroupID = OGP_GroupEnrolment.OGP_GroupID
            INNER JOIN OGP_Enrolment ON OGP_Enrolment.ID = OGP_GroupEnrolment.OGP_EnrolmentID
            INNER JOIN Completion c ON c.id = OGP_Enrolment.OverallCompletionID
            INNER JOIN OGP_Student s ON s.ID = OGP_Enrolment.OGP_StudentID
			INNER JOIN OriginalGroups OG ON OG.StudentRef = OGP_Enrolment.StudentRef --make sure the students exist in the requested group
            INNER JOIN OGP_GroupElement ON OGP_GroupElement.OGP_GroupID = OGP_GroupEnrolment.OGP_GroupID
            INNER JOIN OGP_Element ON OGP_Element.ID = OGP_GroupElement.OGP_ElementID
            INNER JOIN OGP_ElementType ET ON OGP_Element.OGP_ElementTypeID = ET.ID
            LEFT JOIN OGP_Element OGP_ElementDirectParent ON OGP_ElementDirectParent.ID = OGP_Element.DirectParentID
            LEFT JOIN OGP_Element OGP_ElementTopParent ON OGP_ElementTopParent.ID = OGP_Element.TopLevelParentID
            LEFT JOIN OGP_EnrolmentElement EE ON OGP_Enrolment.ID = EE.OGP_EnrolmentID AND OGP_Element.ID = EE.OGP_ElementID
            LEFT JOIN (
                SELECT OGP_Element.ID AS OGP_ElementID, EE1.OGP_EnrolmentID, 1 AS DoesNotDoElement
                FROM OGP_Element 
                INNER JOIN OGP_EnrolmentElement EE1 ON OGP_Element.TopLevelParentID = EE1.OGP_ElementID AND EE1.DoesNotDoElement = 1
                INNER JOIN OGP_GroupElement ON OGP_GroupElement.OGP_ElementID = EE1.OGP_ElementID AND OGP_GroupElement.OGP_GroupID in (select RelatedGroupID from RelatedGroupsCTE)
                INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = EE1.OGP_EnrolmentID
                UNION
                SELECT OGP_Element.ID AS OGP_ElementID, EE2.OGP_EnrolmentID, 1 AS DoesNotDoElement
                FROM OGP_Element 
                INNER JOIN OGP_EnrolmentElement EE2 ON OGP_Element.DirectParentID = EE2.OGP_ElementID AND EE2.DoesNotDoElement = 1
                INNER JOIN OGP_GroupElement ON OGP_GroupElement.OGP_ElementID = EE2.OGP_ElementID AND OGP_GroupElement.OGP_GroupID  in (select RelatedGroupID from RelatedGroupsCTE)
                INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = EE2.OGP_EnrolmentID
                UNION
                SELECT EE3.OGP_ElementID AS OGP_ElementID, EE3.OGP_EnrolmentID, 1 AS DoesNotDoElement
                FROM OGP_EnrolmentElement EE3
                INNER JOIN OGP_GroupElement ON OGP_GroupElement.OGP_ElementID = EE3.OGP_ElementID AND OGP_GroupElement.OGP_GroupID  in (select RelatedGroupID from RelatedGroupsCTE)
                INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = EE3.OGP_EnrolmentID
                AND EE3.DoesNotDoElement = 1
            ) t ON t.OGP_ElementID = OGP_Element.ID AND t.OGP_EnrolmentID = OGP_GroupEnrolment.OGP_EnrolmentID
        WHERE @GetRelatedGroups = 1 and
        OGP_Enrolment.RecordStatus <> 'Obsolete'
		AND ISNULL((SELECT TOP(1) O.RecordStatus FROM OGP_Enrolment O WHERE O.OriginalCourseID = OGP_Enrolment.OriginalCourseID AND O.OGP_StudentID = OGP_Enrolment.OGP_StudentID AND O.RecordStatus = 'Obsolete'),'') <> 'Obsolete'--AMG 23/06/2025
    )
    SELECT *
    FROM OriginalGroups
    UNION ALL
    SELECT *
    FROM RelatedGroups
    ORDER BY IsRelatedGroup ASC, ElementID;
END;





/****** Object:  StoredProcedure [dbo].[sp_WebPlus_SystemMaintPassFailGrade_Update]    Script Date: 14/09/2025 09:20:02 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_WebPlus_SystemMaintPassFailGrade_Update]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_WebPlus_SystemMaintPassFailGrade_Update] AS' 
END
GO

ALTER PROCEDURE [dbo].[sp_WebPlus_SystemMaintPassFailGrade_Update]
  @StaffId        INT,
  @ID             INT,
  @Grade          VARCHAR(100),
  @Points         Decimal(19,2),
  @DefaultGrade   BIT,
  @InflatedGrade  BIT,
  @GradeNo        INT = NULL,
  @ViewOnWebsite  BIT,
  @Obsolete       BIT
AS
-- =======================================================================================
-- Author:		Andrew Breward
-- Create date: 14/09/2025 
-- Descripton:	SP to save the PassFail Grade data 
-- Example:     exec sp_WebPlus_SystemMaintPassFailGrade_Update 2, 1, 'PassFail Grade1', 1,1,0,1,1,0
-- =======================================================================================

SET NOCOUNT ON;

DECLARE  @VALUE_FALSE BIT = 0;
DECLARE  @VALUE_TRUE  BIT = 1;

DECLARE @RowcountReturn INT = 0;  -- default return value 0=no changes

DECLARE @Updated        DATETIME = GetDate();
DECLARE @ChangesToSave  BIT = @VALUE_FALSE;

DECLARE @UserName       VARCHAR(255);
DECLARE @UserForenames  VARCHAR(100);
DECLARE @UserSurname    VARCHAR(100);

DECLARE @RowDescription VARCHAR(500);
DECLARE @TypeOfChange   VARCHAR(50);

DECLARE @Grade_Existing          VARCHAR(100);
DECLARE @Points_Existing         Decimal(19,2);
DECLARE @DefaultGrade_Existing   BIT;
DECLARE @InflatedGrade_Existing  BIT;
DECLARE @GradeNo_Existing        INT;
DECLARE @ViewOnWebsite_Existing  BIT;
DECLARE @Obsolete_Existing       BIT;

DECLARE @ID_Existing             INT;
DECLARE @ID_New                  INT;


IF EXISTS (SELECT 1 FROM Staff WHERE StaffID = @StaffId)
BEGIN
    --Get the Staff Username
    SELECT 
		@UserName = [User].UserName,
		@UserForenames = [User].Forenames,
		@UserSurname = [User].Surname
    FROM Staff 
		INNER JOIN [User] ON [User].UserID = Staff.UserID
    WHERE 
	    StaffID = @StaffId;

  IF @ID <= 0 
  BEGIN
    -- ******************************************************************
    --   1) Create PassFail Grade (UnGradedQualifications_PointsGrades)
    -- ******************************************************************

  	  INSERT INTO 
	    UnGradedQualifications_PointsGrades (Grade,Points,DefaultGrade,InflatedGrade,GradeNo,ViewOnWebsite,Obsolete)
	  VALUES
	    (@Grade,@Points,@DefaultGrade,@InflatedGrade,@GradeNo,@ViewOnWebsite,@Obsolete);

      --get the new ID
	  SELECT @ID_New = SCOPE_IDENTITY();

      --set return to number of rows updated
      SET @RowcountReturn = 1;   

	  --now update the Audit
	  SET @TypeOfChange    = 'INSERT';
      SET @RowDescription  = 'Inserted ID ' + Convert(VARCHAR, @ID_New);

  	  INSERT INTO AuditTrail
		(AuditDate, AuditBy,   AuditChange,   TableName,           RowID,      RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
	  VALUES
		(@Updated, @UserName, @TypeOfChange, 'UnGradedQualifications_PointsGrades',  @ID_New,   @RowDescription,  'Grade', null,        null,   null,  @Grade);
  	  INSERT INTO AuditTrail
		(AuditDate, AuditBy,   AuditChange,   TableName,           RowID,      RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
	  VALUES
		(@Updated, @UserName, @TypeOfChange, 'UnGradedQualifications_PointsGrades',  @ID_New,   @RowDescription,  'Points', null,        null,   null,  @Points);
  	  INSERT INTO AuditTrail
		(AuditDate, AuditBy,   AuditChange,   TableName,           RowID,      RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
	  VALUES
		(@Updated, @UserName, @TypeOfChange, 'UnGradedQualifications_PointsGrades',  @ID_New,   @RowDescription,  'DefaultGrade', null,        null,   null,  Convert(VARCHAR, @DefaultGrade));
  	  INSERT INTO AuditTrail
		(AuditDate, AuditBy,   AuditChange,   TableName,           RowID,      RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
	  VALUES
		(@Updated, @UserName, @TypeOfChange, 'UnGradedQualifications_PointsGrades',  @ID_New,   @RowDescription,  'InflatedGrade', null,        null,   null,  Convert(VARCHAR, @InflatedGrade));
  	  INSERT INTO AuditTrail
		(AuditDate, AuditBy,   AuditChange,   TableName,           RowID,      RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
	  VALUES
		(@Updated, @UserName, @TypeOfChange, 'UnGradedQualifications_PointsGrades',  @ID_New,   @RowDescription,  'GradeNo', null,        null,   null,  @GradeNo);
  	  INSERT INTO AuditTrail
		(AuditDate, AuditBy,   AuditChange,   TableName,           RowID,      RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
	  VALUES
		(@Updated, @UserName, @TypeOfChange, 'UnGradedQualifications_PointsGrades',  @ID_New,   @RowDescription,  'ViewOnWebsite', null,        null,   null,  Convert(VARCHAR, @ViewOnWebsite));
	  INSERT INTO AuditTrail 
		(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,    RowDescription,  FieldName,    OldValue, NewValue,  OldValueDescription, NewValueDescription)
	  VALUES
		(@Updated, @UserName, @TypeOfChange, 'UnGradedQualifications_PointsGrades',  @ID_New,   @RowDescription,  'Obsolete',  null,        null,   null,  Convert(VARCHAR, @Obsolete));

  END
  ELSE
  BEGIN
    -- ******************************************************************
    --   2) Update PassFail Grade (UnGradedQualifications_PointsGrades)
    -- ******************************************************************
    SET @ChangesToSave = @VALUE_FALSE;

    IF EXISTS (SELECT 1 FROM UnGradedQualifications_PointsGrades WHERE ID = @ID)
	BEGIN

		--get the existing values
		SELECT
		  @Grade_Existing          = Grade,
		  @Points_Existing         = Points,         
		  @DefaultGrade_Existing   = DefaultGrade,
		  @InflatedGrade_Existing  = InflatedGrade,
		  @GradeNo_Existing        = GradeNo,
		  @ViewOnWebsite_Existing  = ViewOnWebsite,
		  @Obsolete_Existing       = Obsolete
		FROM
		  UnGradedQualifications_PointsGrades
		WHERE
		  ID = @ID;

		--Check for Updates 
		IF IsNull(@Grade,'') != IsNull(@Grade_Existing,'')
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @Points != @Points_Existing
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @DefaultGrade != @DefaultGrade_Existing
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @InflatedGrade != @InflatedGrade_Existing
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @GradeNo != @GradeNo_Existing
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @ViewOnWebsite != @ViewOnWebsite_Existing
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @Obsolete != @Obsolete_Existing
		  SET @ChangesToSave = @VALUE_TRUE;

		IF @ChangesToSave = @VALUE_TRUE
		BEGIN
		  Print 'Performing Update';

		  --Update changes
  		  UPDATE 
			UnGradedQualifications_PointsGrades
		  SET
			Grade         = @Grade,
			Points        = @Points,
			DefaultGrade  = @DefaultGrade,
			InflatedGrade = @InflatedGrade,
			GradeNo       = @GradeNo,
			ViewOnWebsite = @ViewOnWebsite,
			Obsolete      = @Obsolete
		  WHERE
			ID = @ID;

		  --set return to number of rows updated
		  SET @RowcountReturn = 1;   -- @@ROWCOUNT;

		  --now update the Audit
		  SET @TypeOfChange    = 'UPDATE';
		  SET @RowDescription  = 'Updated ID ' + Convert(VARCHAR, @ID);

		  IF @Grade != @Grade_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'UnGradedQualifications_PointsGrades',  @ID,            @RowDescription,  'Grade', null,        null,   @Grade_Existing,  @Grade);
		  END
		  IF @Points != @Points_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'UnGradedQualifications_PointsGrades',  @ID,            @RowDescription,  'Points', null,        null,   @Points_Existing,  @Points);
		  END
		  IF @DefaultGrade != @DefaultGrade_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'UnGradedQualifications_PointsGrades',  @ID,            @RowDescription,  'DefaultGrade', null,        null,   Convert(VARCHAR, @DefaultGrade_Existing),  Convert(VARCHAR, @DefaultGrade));
		  END
		  IF @InflatedGrade != @InflatedGrade_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'UnGradedQualifications_PointsGrades',  @ID,            @RowDescription,  'InflatedGrade', null,        null,   Convert(VARCHAR, @InflatedGrade_Existing),  Convert(VARCHAR, @InflatedGrade));
		  END
		  IF @GradeNo != @GradeNo_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'UnGradedQualifications_PointsGrades',  @ID,            @RowDescription,  'GradeNo', null,        null,   @GradeNo_Existing,  @GradeNo);
		  END
		  IF @ViewOnWebsite != @ViewOnWebsite_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'UnGradedQualifications_PointsGrades',  @ID,            @RowDescription,  'ViewOnWebsite', null,        null,   Convert(VARCHAR, @ViewOnWebsite_Existing),  Convert(VARCHAR, @ViewOnWebsite));
		  END
		  IF @Obsolete != @Obsolete_Existing BEGIN
			  INSERT INTO AuditTrail 
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,    OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'UnGradedQualifications_PointsGrades',  @ID,            @RowDescription,  'Obsolete',  null,        null,   Convert(VARCHAR, @Obsolete_Existing),  Convert(VARCHAR, @Obsolete));
		  END

		  --We can only have 1 DefaultGrade so clear the previous
		  IF @DefaultGrade = 1
		  BEGIN
			UPDATE 
				UnGradedQualifications_PointsGrades
			SET 
				DefaultGrade = 0
			WHERE 
				DefaultGrade = 1 AND ID != @ID;
		  END

		  --We can only have 1 InflatedGrade so clear the previous
		  IF @InflatedGrade = 1
		  BEGIN
			UPDATE 
				UnGradedQualifications_PointsGrades
			SET 
				InflatedGrade = 0
			WHERE 
				InflatedGrade = 1 AND ID != @ID;
		  END

		END
		ELSE
		BEGIN
			--No Changes so return 0
			SET @RowcountReturn = 0;
		END
    END
	ELSE
	BEGIN
		--ID not found so return -1
		SET @RowcountReturn = -1;
	END
  END  

END   
ELSE
BEGIN
    Print 'StaffID not found';

    -- set return to -2 to indicate StaffID not found
    SET @RowcountReturn = -2;
END

--return number of rows updated (or -'ve error)
SELECT @RowcountReturn AS ReturnValue;
GO




/****** Object:  StoredProcedure [dbo].[sp_WebPlus_SystemMaintNoGradeGrade_Update]    Script Date: 14/09/2025 13:56:50 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_WebPlus_SystemMaintNoGradeGrade_Update]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_WebPlus_SystemMaintNoGradeGrade_Update] AS' 
END
GO

ALTER PROCEDURE [dbo].[sp_WebPlus_SystemMaintNoGradeGrade_Update]
  @StaffId        INT,
  @ID             INT,
  @Grade          VARCHAR(20),
  @Description    VARCHAR(100),
  @Points         Decimal(19,2),
  @DefaultGrade   BIT,
  @GradeNo        INT,
  @Obsolete       BIT
AS
-- =======================================================================================
-- Author:		Andrew Breward
-- Create date: 14/09/2025 
-- Descripton:	SP to save the NoGrade Grade data 
-- Example:     exec sp_WebPlus_SystemMaintNoGradeGrade_Update 2, 1, 'P+','P+ Grade', 1,1,1,0
-- =======================================================================================

SET NOCOUNT ON;

DECLARE  @VALUE_FALSE BIT = 0;
DECLARE  @VALUE_TRUE  BIT = 1;

DECLARE @RowcountReturn INT = 0;  -- default return value 0=no changes

DECLARE @Updated        DATETIME = GetDate();
DECLARE @ChangesToSave  BIT = @VALUE_FALSE;

DECLARE @UserName       VARCHAR(255);
DECLARE @UserForenames  VARCHAR(100);
DECLARE @UserSurname    VARCHAR(100);

DECLARE @RowDescription VARCHAR(500);
DECLARE @TypeOfChange   VARCHAR(50);

DECLARE @Grade_Existing          VARCHAR(20);
DECLARE @Description_Existing    VARCHAR(100);
DECLARE @Points_Existing         Decimal(19,2);
DECLARE @DefaultGrade_Existing   BIT;
DECLARE @GradeNo_Existing        INT;
DECLARE @Obsolete_Existing       BIT;

DECLARE @ID_Existing             INT;
DECLARE @ID_New                  INT;


IF EXISTS (SELECT 1 FROM Staff WHERE StaffID = @StaffId)
BEGIN
    --Get the Staff Username
    SELECT 
		@UserName = [User].UserName,
		@UserForenames = [User].Forenames,
		@UserSurname = [User].Surname
    FROM Staff 
		INNER JOIN [User] ON [User].UserID = Staff.UserID
    WHERE 
	    StaffID = @StaffId;

  IF @ID <= 0 
  BEGIN
    -- ******************************************************************
    --   1) Create NoGrade Grade (GradingScheme_NoGrade)
    -- ******************************************************************

  	  INSERT INTO 
	    GradingScheme_NoGrade (Grade,Description,Points,DefaultTarget,GradeNo,Obsolete)
	  VALUES
	    (@Grade, @Description, @Points, @DefaultGrade, @GradeNo, @Obsolete);

      --get the new ID
	  SELECT @ID_New = SCOPE_IDENTITY();

      --set return to number of rows updated
      SET @RowcountReturn = 1;   

	  --now update the Audit
	  SET @TypeOfChange    = 'INSERT';
      SET @RowDescription  = 'Inserted ID ' + Convert(VARCHAR, @ID_New);

  	  INSERT INTO AuditTrail
		(AuditDate, AuditBy,   AuditChange,   TableName,           RowID,      RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
	  VALUES
		(@Updated, @UserName, @TypeOfChange, 'GradingScheme_NoGrade',  @ID_New,   @RowDescription,  'Grade', null,        null,   null,  @Grade);
  	  INSERT INTO AuditTrail
		(AuditDate, AuditBy,   AuditChange,   TableName,           RowID,      RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
	  VALUES
		(@Updated, @UserName, @TypeOfChange, 'GradingScheme_NoGrade',  @ID_New,   @RowDescription,  'Description', null,        null,   null,  @Description);
  	  INSERT INTO AuditTrail
		(AuditDate, AuditBy,   AuditChange,   TableName,           RowID,      RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
	  VALUES
		(@Updated, @UserName, @TypeOfChange, 'GradingScheme_NoGrade',  @ID_New,   @RowDescription,  'Points', null,        null,   null,  @Points);
  	  INSERT INTO AuditTrail
		(AuditDate, AuditBy,   AuditChange,   TableName,           RowID,      RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
	  VALUES
		(@Updated, @UserName, @TypeOfChange, 'GradingScheme_NoGrade',  @ID_New,   @RowDescription,  'TargetGrade', null,        null,   null,  Convert(VARCHAR, @DefaultGrade));
  	  INSERT INTO AuditTrail
		(AuditDate, AuditBy,   AuditChange,   TableName,           RowID,      RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
	  VALUES
		(@Updated, @UserName, @TypeOfChange, 'GradingScheme_NoGrade',  @ID_New,   @RowDescription,  'GradeNo', null,        null,   null,  @GradeNo);
	  INSERT INTO AuditTrail 
		(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,    RowDescription,  FieldName,    OldValue, NewValue,  OldValueDescription, NewValueDescription)
	  VALUES
		(@Updated, @UserName, @TypeOfChange, 'GradingScheme_NoGrade',  @ID_New,   @RowDescription,  'Obsolete',  null,        null,   null,  Convert(VARCHAR, @Obsolete));

  END
  ELSE
  BEGIN
    -- ******************************************************************
    --   2) Update NoGrade Grade (GradingScheme_NoGrade)
    -- ******************************************************************
    SET @ChangesToSave = @VALUE_FALSE;

    IF EXISTS (SELECT 1 FROM GradingScheme_NoGrade WHERE ID = @ID)
	BEGIN

		--get the existing values
		SELECT
		  @Grade_Existing          = Grade,
		  @Description_Existing    = Description,
		  @Points_Existing         = Points,         
		  @DefaultGrade_Existing   = DefaultTarget,
		  @GradeNo_Existing        = GradeNo,
		  @Obsolete_Existing       = Obsolete
		FROM
		  GradingScheme_NoGrade
		WHERE
		  ID = @ID;

		--Check for Updates 
		IF IsNull(@Grade,'') != IsNull(@Grade_Existing,'')
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF IsNull(@Description,'') != IsNull(@Description_Existing,'')
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @Points != @Points_Existing
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @DefaultGrade != @DefaultGrade_Existing
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @GradeNo != @GradeNo_Existing
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @Obsolete != @Obsolete_Existing
		  SET @ChangesToSave = @VALUE_TRUE;

		IF @ChangesToSave = @VALUE_TRUE
		BEGIN
		  Print 'Performing Update';

		  --Update changes
  		  UPDATE 
			GradingScheme_NoGrade
		  SET
			Grade         = @Grade,
			Description   = @Description,
			Points        = @Points,
			DefaultTarget = @DefaultGrade,
			GradeNo       = @GradeNo,
			Obsolete      = @Obsolete
		  WHERE
			ID = @ID;

		  --set return to number of rows updated
		  SET @RowcountReturn = 1;   -- @@ROWCOUNT;

		  --now update the Audit
		  SET @TypeOfChange    = 'UPDATE';
		  SET @RowDescription  = 'Updated ID ' + Convert(VARCHAR, @ID);

		  IF @Grade != @Grade_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'GradingScheme_NoGrade',  @ID,            @RowDescription,  'Grade', null,        null,   @Grade_Existing,  @Grade);
		  END
		  IF @Description != @Description_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'GradingScheme_NoGrade',  @ID,            @RowDescription,  'Description', null,        null,   @Description_Existing,  @Description);
		  END
		  IF @Points != @Points_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'GradingScheme_NoGrade',  @ID,            @RowDescription,  'Points', null,        null,   @Points_Existing,  @Points);
		  END
		  IF @DefaultGrade != @DefaultGrade_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'GradingScheme_NoGrade',  @ID,            @RowDescription,  'DefaultTarget', null,        null,   Convert(VARCHAR, @DefaultGrade_Existing),  Convert(VARCHAR, @DefaultGrade));
		  END
		  IF @GradeNo != @GradeNo_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'GradingScheme_NoGrade',  @ID,            @RowDescription,  'GradeNo', null,        null,   @GradeNo_Existing,  @GradeNo);
		  END
		  IF @Obsolete != @Obsolete_Existing BEGIN
			  INSERT INTO AuditTrail 
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,    OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'GradingScheme_NoGrade',  @ID,            @RowDescription,  'Obsolete',  null,        null,   Convert(VARCHAR, @Obsolete_Existing),  Convert(VARCHAR, @Obsolete));
		  END

		  --We can only have 1 DefaultGrade so clear the previous
		  IF @DefaultGrade = 1
		  BEGIN
			UPDATE 
				GradingScheme_NoGrade
			SET 
				DefaultTarget = 0
			WHERE 
				DefaultTarget = 1 AND ID != @ID;
		  END

		END
		ELSE
		BEGIN
			--No Changes so return 0
			SET @RowcountReturn = 0;
		END
    END
	ELSE
	BEGIN
		--ID not found so return -1
		SET @RowcountReturn = -1;
	END
  END  

END   
ELSE
BEGIN
    Print 'StaffID not found';

    -- set return to -2 to indicate StaffID not found
    SET @RowcountReturn = -2;
END

--return number of rows updated (or -'ve error)
SELECT @RowcountReturn AS ReturnValue;
GO





/****** Object:  StoredProcedure [dbo].[sp_WebPlus_SystemSettingFlag_Update]    Script Date: 15/09/2025 19:49:48 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_WebPlus_SystemSettingFlag_Update]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_WebPlus_SystemSettingFlag_Update] AS' 
END
GO

ALTER PROCEDURE [dbo].[sp_WebPlus_SystemSettingFlag_Update]
  @StaffId             INTEGER,
  @SystemSettingName   VARCHAR(100),         
  @SystemSettingValue  BIT
AS
-- =============================================
-- Author:		Andy Breward
-- Create date: 17/09/2025 
-- Descripton:	SP to Update a SystemSettingFlag
-- =============================================
DECLARE @returnValue INT = 0;
DECLARE @ID          INT = -1;
DECLARE @Updated      DATETIME = GetDate();

DECLARE @VALUE_FALSE BIT = 0;
DECLARE @VALUE_TRUE  BIT = 1;

DECLARE @UserName       VARCHAR(255);
DECLARE @UserForenames  VARCHAR(100);
DECLARE @UserSurname    VARCHAR(100);

DECLARE @RowDescription VARCHAR(500);
DECLARE @TypeOfChange   VARCHAR(50);

DECLARE @ChangesToSave BIT = @VALUE_FALSE;

DECLARE @SystemSettingValue_Existing BIT;

DECLARE @NewValueType VARCHAR(50);
DECLARE @NewValueDescr VARCHAR(5000);

--***********************************************************************************

Print 'Updating SystemSettingName  = ' + @SystemSettingName;
Print 'Updating SystemSettingValue = ' + Convert(VARCHAR, @SystemSettingValue);

IF EXISTS (SELECT 1 FROM Staff WHERE StaffID = @StaffId)
BEGIN

  --Get the Staff Username
  SELECT 
		@UserName = [User].UserName,
		@UserForenames = [User].Forenames,
		@UserSurname = [User].Surname
  FROM Staff 
		INNER JOIN [User] ON [User].UserID = Staff.UserID
  WHERE 
	    StaffID = @staffId;

  SELECT 
	@ID                          = ID,
	@SystemSettingValue_Existing = Value
  FROM 
	SystemSettingFlag 
  WHERE 
    SettingName = @SystemSettingName; 

  Print 'Updating ID = ' + Convert(VARCHAR, IsNull(@ID,-1));

  IF IsNull(@ID, -1) > 0                               
  BEGIN
	  IF IsNull(@SystemSettingValue_Existing, '') != IsNull(@SystemSettingValue, '')
	  BEGIN
		  --Only Update when different
		  UPDATE
			[SystemSettingFlag] 
		  SET
			Value = @SystemSettingValue
		  WHERE
			SettingName = @SystemSettingName; 

		  SET @TypeOfChange    = 'UPDATE';
		  SET @RowDescription  = 'Updated SystemSettingFlag=' + @SystemSettingName;

		  --set the return value as the ID updated
		  SET @returnValue = Abs(@ID);

		  --Update the Audit
		  INSERT INTO AuditTrail 
			(AuditDate, AuditBy,   AuditChange,  TableName,            RowID, RowDescription, FieldName, OldValue, NewValue, OldValueDescription, NewValueDescription)
		  VALUES
			(@Updated, @UserName, @TypeOfChange, 'SystemSettingFlag', @ID,  @RowDescription, 'Value', null, null, Convert(VARCHAR, @SystemSettingValue_Existing), Convert(VARCHAR, @SystemSettingValue));

	  END
	  ELSE
	  BEGIN
		  -- set return to 0 to indicate no changes
		  SET @returnValue = 0;

		  Print 'No Changes';
	  END

  END
  ELSE
  BEGIN
      -- set return to -1 to indicate ID not found
	  SET @returnValue = -1;

	  Print 'ID Not Found';
  END

END
ELSE
BEGIN
    -- set return to -2 to indicate StaffID not found
    SET @returnValue = -2;
END

SELECT @returnValue AS ReturnValue;
GO





/****** Object:  StoredProcedure [dbo].[sp_WebPlus_SystemMaintUserDefinedField_Update]    Script Date: 15/09/2025 19:49:48 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_WebPlus_SystemMaintUserDefinedField_Update]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_WebPlus_SystemMaintUserDefinedField_Update] AS' 
END
GO

ALTER PROCEDURE [dbo].[sp_WebPlus_SystemMaintUserDefinedField_Update]
  @StaffId             INTEGER,
  @ID                  INTEGER, 
  @UserDefinedName     VARCHAR(8000)
AS
-- =============================================
-- Author:		Andy Breward
-- Create date: 18/09/2025 
-- Descripton:	SP to Update a UserDefinedField
-- =============================================
DECLARE @returnValue INT = 0;
DECLARE @Updated      DATETIME = GetDate();

DECLARE @VALUE_FALSE BIT = 0;
DECLARE @VALUE_TRUE  BIT = 1;

DECLARE @UserName       VARCHAR(255);
DECLARE @UserForenames  VARCHAR(100);
DECLARE @UserSurname    VARCHAR(100);

DECLARE @RowDescription VARCHAR(500);
DECLARE @TypeOfChange   VARCHAR(50);

DECLARE @ChangesToSave BIT = @VALUE_FALSE;

DECLARE @UserDefinedName_Existing VARCHAR(8000);
DECLARE @TableSystemName_Existing VARCHAR(201);

DECLARE @NewValueType VARCHAR(50);
DECLARE @NewValueDescr VARCHAR(5000);

--***********************************************************************************


IF EXISTS (SELECT 1 FROM Staff WHERE StaffID = @StaffId)
BEGIN

  --Get the Staff Username
  SELECT 
		@UserName = [User].UserName,
		@UserForenames = [User].Forenames,
		@UserSurname = [User].Surname
  FROM Staff 
		INNER JOIN [User] ON [User].UserID = Staff.UserID
  WHERE 
	    StaffID = @staffId;

  IF EXISTS (SELECT 1 FROM UserDefinedFields WHERE ID = @ID)
  BEGIN
	  SELECT 
		@UserDefinedName_Existing = IsNull(UserDefinedName,''),
		@TableSystemName_Existing = IsNull(TableName,'') + '.' + IsNull(SystemName,'')
	  FROM 
		UserDefinedFields 
	  WHERE 
		ID = @ID; 

  	  Print 'Updating ID = ' + Convert(VARCHAR, @ID);
	  Print 'Updating UserDefinedName = ' + IsNull(@UserDefinedName, '');

	  IF IsNull(@UserDefinedName_Existing, '') != IsNull(@UserDefinedName, '')
	  BEGIN
		  --Only Update when different
		  UPDATE
			[UserDefinedFields] 
		  SET
			UserDefinedName = @UserDefinedName
		  WHERE
			ID = @ID; 

		  SET @TypeOfChange    = 'UPDATE';
		  SET @RowDescription  = 'Updated ID=' + Convert(VARCHAR, IsNull(@ID,-1)) + ' (' + @TableSystemName_Existing + ')';

		  --set the return value as the ID updated
		  SET @returnValue = Abs(@ID);

		  --Update the Audit
		  INSERT INTO AuditTrail 
			(AuditDate, AuditBy,   AuditChange,  TableName,            RowID, RowDescription, FieldName, OldValue, NewValue, OldValueDescription, NewValueDescription)
		  VALUES
			(@Updated, @UserName, @TypeOfChange, 'UserDefinedFields', @ID,  @RowDescription, 'UserDefinedName', null, null, IsNull(@UserDefinedName_Existing,''), IsNull(@UserDefinedName,''));

	  END
	  ELSE
	  BEGIN
		  -- set return to 0 to indicate no changes
		  SET @returnValue = 0;

		  Print 'No Changes';
	  END

  END
  ELSE
  BEGIN
      -- set return to -1 to indicate ID not found
	  SET @returnValue = -1;

	  Print 'ID Not Found';
  END

END
ELSE
BEGIN
    -- set return to -2 to indicate StaffID not found
    SET @returnValue = -2;
END

SELECT @returnValue AS ReturnValue;
GO







/****** Object:  StoredProcedure [dbo].[sp_WebPlus_MarkBookMaint_Select]    Script Date: 20/09/2025 09:08:49 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



ALTER PROCEDURE [dbo].[sp_WebPlus_MarkBookMaint_Select]
  @DataType    VARCHAR(50),
  @SelectID    INT         = NULL,
  @SelectRef   VARCHAR(50) = NULL,
  @SelectCargo VARCHAR(50) = NULL
AS
-- ============================================================================================
-- Author:		Andrew Breward
-- Create date: 04/08/2025 
-- Descripton:	SP to retrieve the MarkBook Maint data (specified by @DataType parameter)
-- Examples:    exec sp_WebPlus_MarkBookMaint_Select 'MARKBOOKTYPES'
--              exec sp_WebPlus_MarkBookMaint_Select 'MARKBOOKLEVELS'
--              exec sp_WebPlus_MarkBookMaint_Select 'MARKBOOKFIELDS'
--              exec sp_WebPlus_MarkBookMaint_Select 'MARKBOOKGRADECOLOUR'
--              exec sp_WebPlus_MarkBookMaint_Select 'MARKBOOKCATEGORIES'
--              exec sp_WebPlus_MarkBookMaint_Select 'COURSEELEMENTS', 5575
--              exec sp_WebPlus_MarkBookMaint_Select 'CHILDELEMENTS', 1
--              exec sp_WebPlus_MarkBookMaint_Select 'ELEMENT', 2
--              exec sp_WebPlus_MarkBookMaint_Select 'OFQUALUNITS', null, '60185880'
--              exec sp_WebPlus_MarkBookMaint_Select 'COURSEELEMENTSCOUNT', 5575
--              exec sp_WebPlus_MarkBookMaint_Select 'GROUPELEMENTS', 25
--              exec sp_WebPlus_MarkBookMaint_Select 'ACADEMICYEARDATES', null, '24/25'
--              exec sp_WebPlus_MarkBookMaint_Select 'GROUPELEMENTSTUDENTS', 2, '21'
--              EXEC sp_WebPlus_MarkBookMaint_Select 'COURSEELEMENTSTREE', 29
--              EXEC sp_WebPlus_MarkBookMaint_Select 'STUDENTGROUPS', null, '30147979', '24/25'
--              EXEC sp_WebPlus_MarkBookMaint_Select 'STUDENTVIEW', 5190
--              EXEC sp_WebPlus_MarkBookMaint_Select 'RELATEDGROUPS', 21
--              EXEC sp_WebPlus_MarkBookMaint_Select 'MARKBOOKOPTION'
--              EXEC sp_WebPlus_MarkBookMaint_Select 'MARKBOOKOPTIONDETAIL', 1
--              EXEC sp_WebPlus_MarkBookMaint_Select 'MARKBOOKCOURSEOPTION', 1, 29
--              EXEC sp_WebPlus_MarkBookMaint_Select 'GROUPELEMENTSTREEDATA', 21
--
-- Modified: AndyB v1.40.1 20/09/2025 Added call to dbo.fn_GetAutocompleteStatus in COURSEELEMENTS and CHILDELEMENTS
-- ============================================================================================

DECLARE @UnitName       VARCHAR(50) = 'Unit';
DECLARE @AssessmentName VARCHAR(50) = 'Assessment';
DECLARE @CriteriaName   VARCHAR(50) = 'Criteria';

DECLARE @UnitID           INT = (SELECT ID FROM OGP_ElementType WHERE Description = @UnitName);
DECLARE @AssessmentID     INT = (SELECT ID FROM OGP_ElementType WHERE Description = @AssessmentName);
DECLARE @CriteriaID       INT = (SELECT ID FROM OGP_ElementType WHERE Description = @CriteriaName);

DECLARE @UnitNameAlt       VARCHAR(50) = (SELECT Coalesce(NULLIF(ElementAlternativeName,''), Description)     FROM OGP_ElementType WHERE Description = @UnitName);
DECLARE @AssessmentNameAlt VARCHAR(50) = (SELECT Coalesce(NULLIF(ElementAlternativeName,''), Description)     FROM OGP_ElementType WHERE Description = @AssessmentName);
DECLARE @CriteriaNameAlt   VARCHAR(50) = (SELECT Coalesce(NULLIF(ElementAlternativeName,''), Description)     FROM OGP_ElementType WHERE Description = @CriteriaName);

DECLARE @CourseID         INT = 0;
DECLARE @StudentID        INT = 0;
DECLARE @EnrolmentID      INT = 0;
DECLARE @GroupID          INT = 0;
DECLARE @ElementID        INT = 0;
DECLARE @GroupEnrolmentID INT = 0;
DECLARE @AcademicYearID   VARCHAR(5) = '';

IF (@DataType = 'ELEMENTTYPE' OR @DataType = 'MARKBOOKTYPES')
BEGIN

	SELECT 
	  *
	FROM 
	  OGP_ElementType
	ORDER BY
	  OGP_ElementType.ID;

END
ELSE IF (@DataType = 'CATEGORIES' OR @DataType = 'MARKBOOKCATEGORIES')
BEGIN

    SELECT
	  id,
	  Category,
	  OrderBy,
      (SELECT Count(1) FROM OGP_MarkbookField WHERE OGP_MarkbookField.OGP_MarkbookField_CategoryID = OGP_MarkbookField_Category.ID) AS CategoryCount
	FROM
	  OGP_MarkbookField_Category
	ORDER BY
	  OrderBy;  -- order by

END
ELSE IF (@DataType = 'ELEMENTLEVEL' OR @DataType = 'MARKBOOKLEVELS')
BEGIN

  SELECT 
    el.ID,
    el.ElementLevel,
	el.ElementLevelName AS ElementNameDescription,
    el.OrderBy,
	(SELECT Count(1) FROM OGP_Element              WHERE OGP_Element.OGP_ElementLevelID              = el.ID) AS ElementCount
	--(SELECT Count(1) FROM OGP_Course_Element_Grade WHERE OGP_Course_Element_Grade.OGP_ElementLevelID = el.ID) AS CourseElementGradeCount
  FROM 
    OGP_Element_Level el
  ORDER BY 
    OrderBy;

END
--ELSE IF @DataType = 'COURSEELEMENTGRADE'
--BEGIN

--	SELECT 
--	  *
--	FROM 
--	  OGP_Course_Element_Grade
--	ORDER BY
--	  OrderBy;

--END
ELSE IF (@DataType = 'MARKBOOKFIELDS' OR @DataType = 'FIELDNAMES')
BEGIN

	SELECT 
	  c.Category,
	  c.OrderBy AS CategoryOrderBy,
	  a.OrderBy AS OrderBy,
	  a.ID,  
	  a.SystemName, 
	  a.OverrideName, 
	  a.SystemAbbvn, 
	  a.OverrideAbbvn, 
	  a.OGP_MarkbookField_CategoryID AS MarkbookField_CategoryID,
	  (SELECT b1.IsUsed             FROM OGP_ElementType_MarkbookField b1 WHERE a.ID = b1.OGP_MarkbookFieldID AND b1.OGP_ElementTypeID = @UnitID)       AS UnitIsUsed,
	  (SELECT b2.IsVisibleByDefault FROM OGP_ElementType_MarkbookField b2 WHERE a.ID = b2.OGP_MarkbookFieldID AND b2.OGP_ElementTypeID = @UnitID)       AS UnitIsVisibleByDefault,
	  (SELECT b3.IsUsed             FROM OGP_ElementType_MarkbookField b3 WHERE a.ID = b3.OGP_MarkbookFieldID AND b3.OGP_ElementTypeID = @AssessmentID) AS AssessmentIsUsed,
	  (SELECT b4.IsVisibleByDefault FROM OGP_ElementType_MarkbookField b4 WHERE a.ID = b4.OGP_MarkbookFieldID AND b4.OGP_ElementTypeID = @AssessmentID) AS AssessmentIsVisibleByDefault,
	  (SELECT b5.IsUsed             FROM OGP_ElementType_MarkbookField b5 WHERE a.ID = b5.OGP_MarkbookFieldID AND b5.OGP_ElementTypeID = @CriteriaID)   AS CriteriaIsUsed,
	  (SELECT b6.IsVisibleByDefault FROM OGP_ElementType_MarkbookField b6 WHERE a.ID = b6.OGP_MarkbookFieldID AND b6.OGP_ElementTypeID = @CriteriaID)   AS CriteriaIsVisibleByDefault
	FROM  
	  OGP_MarkbookField a
	LEFT JOIN 
	  OGP_MarkbookField_Category c ON
	    a.OGP_MarkbookField_CategoryID = c.ID
	WHERE
		SystemName != 'Complete'     -- Complete is now a Fixed field and so can't be edited
	ORDER BY
	  2,3;   -- Category-Orderby, Field-OrderBy
	

END
ELSE IF (@DataType = 'GRADECOLOUR' OR @DataType = 'MARKBOOKGRADECOLOUR') 
BEGIN

	SELECT 
	  CASE 
	    WHEN IsNull(OGP_ElementType.ElementAlternativeName, '') = '' THEN 
		  OGP_ElementType.Description 
		ELSE 
		  OGP_ElementType.ElementAlternativeName 
		END AS ElementTypeName,
	  --OGP_ElementType.ElementAlternativeName AS ElementAlternativeName,
	  --OGP_ElementType.Description AS ElementTypeDescription,
	  OGP_ElementType_Grade_Colour.ID,
	  OGP_ElementType_Grade_Colour.Grade,
	  OGP_ElementType_Grade_Colour.Description,
	  OGP_ElementType_Grade_Colour.BackgroundColour,
	  OGP_ElementType_Grade_Colour.FontColour,
	  OGP_ElementType_Grade_Colour.OrderBy,
	  OGP_ElementType_Grade_Colour.OGP_ElementTypeID
	FROM 
	  OGP_ElementType_Grade_Colour
	INNER JOIN 
	  OGP_ElementType ON OGP_ElementType_Grade_Colour.OGP_ElementTypeID = OGP_ElementType.ID
	ORDER BY
	  OGP_ElementType_Grade_Colour.OGP_ElementTypeID,
	  OGP_ElementType_Grade_Colour.OrderBy;

END
ELSE IF @DataType = 'COURSEELEMENTS'
BEGIN
	--Note: we want both 'Active' and 'Obsolete' records (the client will filter them)
	SELECT 
		dbo.fn_GetAutocompleteStatus(OGP_Element.CourseID, OGP_Element.ID) As AutoCompleteStatus,
		''                            AS ParentElementTypeName,
		OGP_ElementType.Description   AS ElementTypeName, 
		OGP_ElementType.ElementAlternativeName AS ElementAlternativeName,
		Course.CourseCode,
		OGP_Element.*,
		OGP_Element_Level.ElementLevelName,
        (SELECT 1 WHERE 
		    EXISTS 
		        (SELECT 1 FROM OGP_Element e2 WHERE e2.DirectParentID = OGP_Element.ID OR e2.TopLevelParentID = OGP_Element.ID) 
		) AS HasChildren,
        (SELECT 1 WHERE 
		    EXISTS 
		        (SELECT 1 FROM OGP_EnrolmentElement WHERE OGP_ElementID = OGP_Element.ID) 
		) AS IsUsed,
        (SELECT 1 WHERE 
			EXISTS 
			    (SELECT 1 FROM OGP_GroupElement WHERE OGP_ElementID = OGP_Element.ID) 
		) AS IsAllocatedToGroup
	FROM 
	    OGP_Element 
		  INNER JOIN Course ON
		    OGP_Element.CourseID = Course.ID
 	      INNER JOIN OGP_ElementType ON 
		    OGP_Element.OGP_ElementTypeID = OGP_ElementType.ID 
		  LEFT JOIN OGP_Element_Level ON
			OGP_Element.OGP_ElementLevelID = OGP_Element_Level.ID
	WHERE 
		OGP_Element.CourseID = @SelectID
	  AND
		OGP_Element.DirectParentID is NULL AND OGP_Element.TopLevelParentID IS NULL
	  --AND
	  --  OGP_Element.RecordStatus != 'Obsolete'
	ORDER BY 
		OGP_Element.OrderBy;

END
ELSE IF @DataType = 'GROUPELEMENTS'
BEGIN
    --Note: @SelectID is the GroupID
	--Note: we want both 'Active' and 'Obsolete' records (the client will filter them)
	SELECT @CourseID = (SELECT CourseID From OGP_Group WHERE ID = @SelectID);

	SELECT 
		OGP_Element.ID               AS ElementID,
		OGP_Element.ElementCode      AS ElementCode, 
		OGP_Element.Description      AS ElementDescription, 
		OGP_Element.OrderBy          AS OrderBy, 
		OGP_Element.RecordStatus     AS RecordStatus,
		OGP_ElementType.ID           AS ElementTypeID, 
		OGP_ElementType.Description  AS ElementTypeName, 
		OGP_ElementType.ElementAlternativeName AS ElementAlternativeName,
		OGP_GroupElement.ID          AS GroupElementID, 
	    OGP_GroupElement.OGP_GroupID AS GroupElementGroupID,
		OGP_GroupElement.*,
		Staff.Forenames              AS StaffForenames,
		Staff.Surname                AS StaffSurname,
		Staff.StaffCode              AS StaffCode,
        (SELECT 1 WHERE 
		    EXISTS 
		        (SELECT 1 FROM OGP_Element e2 WHERE e2.RecordStatus != 'Obsolete' AND (e2.DirectParentID = OGP_Element.ID OR e2.TopLevelParentID = OGP_Element.ID) ) 
		) AS HasActiveChildren,
        (SELECT 1 WHERE 
		    EXISTS 
		        (SELECT 1 FROM OGP_Element e2 WHERE e2.DirectParentID = OGP_Element.ID OR e2.TopLevelParentID = OGP_Element.ID) 
		) AS HasChildren
		
	FROM 
		OGP_Element
			INNER JOIN OGP_ElementType ON OGP_Element.OGP_ElementTypeID = OGP_ElementType.ID
			LEFT JOIN OGP_GroupElement ON OGP_Element.ID = OGP_GroupElement.OGP_ElementID AND OGP_GroupElement.OGP_GroupID = @SelectID
			LEFT JOIN Staff ON Staff.StaffID = OGP_GroupElement.StaffID
	WHERE
		OGP_Element.CourseID = @CourseID 
	AND
		OGP_Element.DirectParentID is NULL AND OGP_Element.TopLevelParentID IS NULL
	--AND
    --    OGP_GroupElement.OGP_GroupID IS NULL OR OGP_GroupElement.OGP_GroupID = @SelectID
	ORDER BY 
		OrderBy;

	--SELECT 
	--	OGP_GroupElement.*, 
	--	OGP_Element.ElementCode                AS ElementCode, 
	--	OGP_Element.Description                AS ElementDescription, 
	--	OGP_Element.OrderBy                    AS OrderBy, 
	--	OGP_Element.RecordStatus               AS RecordStatus,
	--	OGP_ElementType.ID                     AS ElementTypeID, 
	--	OGP_ElementType.Description            AS ElementTypeName, 
	--	OGP_ElementType.ElementAlternativeName AS ElementAlternativeName
	--FROM 
	--	OGP_GroupElement
	--		INNER JOIN OGP_Element ON OGP_GroupElement.OGP_ElementID = OGP_Element.ID
	--			INNER JOIN OGP_ElementType ON OGP_Element.OGP_ElementTypeID = OGP_ElementType.ID
	--WHERE
	--	OGP_GroupElement.OGP_GroupID = @SelectID
	--ORDER BY 
	--	OrderBy;

END
ELSE IF @DataType = 'CHILDGROUPELEMENTS'
BEGIN
    --Note: @SelectID is the ParentID
	--Note: @SelectRef is the GroupID
	--Note: we want both 'Active' and 'Obsolete' records (the client will filter them)

	SELECT 
		OGP_Element.ID               AS ElementID,
		OGP_Element.ElementCode      AS ElementCode, 
		OGP_Element.Description      AS ElementDescription, 
		OGP_Element.OrderBy          AS OrderBy, 
		OGP_Element.RecordStatus     AS RecordStatus,
		OGP_ElementType.ID           AS ElementTypeID, 
		OGP_ElementType.Description  AS ElementTypeName, 
		OGP_ElementType.ElementAlternativeName AS ElementAlternativeName,
		OGP_GroupElement.ID          AS GroupElementID, 
	    OGP_GroupElement.OGP_GroupID AS GroupElementGroupID,
		OGP_GroupElement.*,
        (SELECT 1 WHERE 
		    EXISTS 
		        (SELECT 1 FROM OGP_Element e2 WHERE e2.RecordStatus != 'Obsolete' AND (e2.DirectParentID = OGP_Element.ID OR e2.TopLevelParentID = OGP_Element.ID) ) 
		) AS HasActiveChildren,
        (SELECT 1 WHERE 
		    EXISTS 
		        (SELECT 1 FROM OGP_Element e2 WHERE e2.DirectParentID = OGP_Element.ID OR e2.TopLevelParentID = OGP_Element.ID) 
		) AS HasChildren
		
	FROM 
		OGP_Element
			INNER JOIN OGP_ElementType ON OGP_Element.OGP_ElementTypeID = OGP_ElementType.ID
			LEFT JOIN OGP_GroupElement ON OGP_Element.ID = OGP_GroupElement.OGP_ElementID AND OGP_GroupElement.OGP_GroupID = @SelectRef
	WHERE
		OGP_Element.DirectParentID = @SelectID
	ORDER BY 
		OrderBy;

END
ELSE IF @DataType = 'COURSEELEMENTSCOUNT'
BEGIN
    --Note: for the COUNT we only want 'Active' records
	SELECT 
		Count(1) AS ElementCount
	FROM 
	    OGP_Element 
	WHERE 
		OGP_Element.CourseID = @SelectID
	  AND
		OGP_Element.DirectParentID is NULL AND OGP_Element.TopLevelParentID IS NULL
	  AND
	    OGP_Element.RecordStatus != 'Obsolete'

END
ELSE IF @DataType = 'CHILDELEMENTS'
BEGIN

	SELECT 
		dbo.fn_GetAutocompleteStatus(OGP_Element.CourseID, OGP_Element.ID) As AutoCompleteStatus,
		(SELECT TOP 1 OGPET.Description FROM OGP_ElementType OGPET WHERE OGPET.ID = 
		    (SELECT OGP_ELementTypeID FROM OGP_Element OGPE WHERE OGPE.ID = OGP_Element.DirectParentID) ) AS ParentElementTypeName,
		OGP_ElementType.Description AS ElementTypeName, 
		OGP_ElementType.ElementAlternativeName AS ElementAlternativeName,
		Course.CourseCode,
		OGP_Element.*,
		OGP_Element_Level.ElementLevelName AS ElementLevelName,
        (SELECT 1 WHERE 
		    EXISTS 
		        (SELECT 1 FROM OGP_Element e2 WHERE e2.DirectParentID = OGP_Element.ID OR e2.TopLevelParentID = OGP_Element.ID) 
		) AS HasChildren,
        (SELECT 1 WHERE 
		    EXISTS 
		        (SELECT 1 FROM OGP_EnrolmentElement WHERE OGP_ElementID = OGP_Element.ID) 
		) AS IsUsed,
        (SELECT 1 WHERE 
			EXISTS 
			    (SELECT 1 FROM OGP_GroupElement WHERE OGP_ElementID = OGP_Element.ID) 
		) AS IsAllocatedToGroup
	FROM 
	    OGP_Element 
		  INNER JOIN Course ON
		    OGP_Element.CourseID = Course.ID
 	      INNER JOIN OGP_ElementType ON 
		    OGP_Element.OGP_ElementTypeID = OGP_ElementType.ID 
		  LEFT JOIN OGP_Element_Level ON
			OGP_Element.OGP_ElementLevelID = OGP_Element_Level.ID
	WHERE 
		OGP_Element.DirectParentID = @SelectID
	--  AND
	--	OGP_Element.RecordStatus != 'Obsolete'
	ORDER BY 
		OGP_Element.OrderBy;

END
ELSE IF @DataType = 'ELEMENT'
BEGIN

	SELECT 
		(SELECT TOP 1 OGPET.Description FROM OGP_ElementType OGPET WHERE OGPET.ID = 
		    (SELECT OGP_ELementTypeID FROM OGP_Element OGPE WHERE OGPE.ID = OGP_Element.DirectParentID) ) AS ParentElementTypeName,
		OGP_ElementType.Description AS ElementTypeName, 
		OGP_ElementType.ElementAlternativeName AS ElementAlternativeName,
		Course.CourseCode,
		OGP_Element.*,
		OGP_Element_Level.ElementLevelName AS ElementLevelName,
        (SELECT 1 WHERE 
		    EXISTS 
		        (SELECT 1 FROM OGP_Element e2 WHERE e2.DirectParentID = OGP_Element.ID OR e2.TopLevelParentID = OGP_Element.ID) 
		) AS HasChildren,
        (SELECT 1 WHERE 
		    EXISTS 
		        (SELECT 1 FROM OGP_EnrolmentElement WHERE OGP_ElementID = OGP_Element.ID) 
		) AS IsUsed,
        (SELECT 1 WHERE 
			EXISTS 
			    (SELECT 1 FROM OGP_GroupElement WHERE OGP_ElementID = OGP_Element.ID) 
		) AS IsAllocatedToGroup
	FROM 
	    OGP_Element 
		  INNER JOIN Course ON
		    OGP_Element.CourseID = Course.ID
 	      INNER JOIN OGP_ElementType ON 
		    OGP_Element.OGP_ElementTypeID = OGP_ElementType.ID 
		  LEFT JOIN OGP_Element_Level ON
			OGP_Element.OGP_ElementLevelID = OGP_Element_Level.ID
	WHERE 
		OGP_Element.ID = @SelectID
	--  AND
	--	OGP_Element.RecordStatus != 'Obsolete'
	ORDER BY 
		OGP_Element.OrderBy;

END
ELSE IF @DataType = 'OFQUALUNITS'
BEGIN

	SELECT 
		Unit.*
	FROM 
		Unit
			INNER JOIN QualificationUnit ON 
				Unit.UnitKey = QualificationUnit.UnitKey
	WHERE 
		QualificationUnit.QualificationNumber = @SelectRef;



END
ELSE IF @DataType = 'ACADEMICYEARDATES'
BEGIN

	SELECT
		GetDate() As CurrentDate,
		AcademicYearID,
		CAST((CAST(AcademicYearNo AS VARCHAR) + '0801') AS DateTime) AS CurrentAcYearStartDate,
		CAST((CAST(AcademicYearNo + 1 AS VARCHAR) + '0731') AS DateTime) AS CurrentAcYearEndDate ,
		DATEDIFF(d, GetDate(), CAST((CAST(AcademicYearNo + 1 AS VARCHAR) + '0731') AS DateTime) ) AS DueDays
	FROM
		AcademicYear
	WHERE
		AcademicYearID = @SelectRef;


END
ELSE IF @DataType = 'GROUPELEMENTSTUDENTS'
BEGIN

    --Note: @SelectID  is the GroupElementID
	--Note: @SelectRef is the GroupID

	SELECT @ElementID = OGP_ElementID FROM OGP_GroupElement WHERE ID = @SelectID;
	SELECT @GroupID = Convert(int, @SelectRef);

	SELECT 
		OGP_Enrolment.ID                  AS EnrolmentID, 
		OGP_EnrolmentElement.ID           AS EnrolmentElementID,
		@SelectID                         AS GroupElementID,
		@ElementID                        AS ElementID,
		@GroupID                          AS GroupID,
		OGP_Enrolment.StudentRef, 
		OGP_Student.Surname, 
		OGP_Student.Forenames, 
		OGP_GroupEnrolment.OGP_GroupID    AS GroupID, 
		OGP_Enrolment.OverallCompletionID AS CompletionID,
		Completion.Description            AS CompletionDescription,
		IsNull(OGP_EnrolmentElement.DoesNotDoElement, 0) AS DoesNotDoElement  
	FROM 
		OGP_GroupEnrolment 
			INNER JOIN OGP_Enrolment ON 
				OGP_GroupEnrolment.OGP_EnrolmentID = OGP_Enrolment.ID  
			INNER JOIN OGP_Student   ON 
				OGP_Student.ID = OGP_Enrolment.OGP_StudentID
            INNER JOIN Completion ON 
				Completion.id = OGP_Enrolment.OverallCompletionID
			LEFT  JOIN OGP_EnrolmentElement  ON 
				OGP_Enrolment.ID = OGP_EnrolmentElement.OGP_EnrolmentID AND OGP_EnrolmentElement.OGP_ElementID = @ElementID
	WHERE 
		OGP_GroupID = @GroupID
	ORDER BY
		Surname, Forenames;

END
ELSE IF @DataType = 'COURSEELEMENTSTREE'
BEGIN

	SELECT 
		''                            AS ParentElementTypeName,
		OGP_ElementType.Description   AS ElementTypeName, 
		OGP_ElementType.ElementAlternativeName AS ElementAlternativeName,
		Course.CourseCode,
		OGP_Element.*,
		OGP_Element_Level.ElementLevelName,
        (SELECT 1 WHERE 
		    EXISTS 
		        (SELECT 1 FROM OGP_Element e2 WHERE 
					(e2.RecordStatus != 'Obsolete') AND
					(e2.DirectParentID = OGP_Element.ID OR e2.TopLevelParentID = OGP_Element.ID)
				) 
		) AS HasChildren,
        (SELECT 1 WHERE 
		    EXISTS 
		        (SELECT 1 FROM OGP_EnrolmentElement WHERE OGP_ElementID = OGP_Element.ID) 
		) AS IsUsed,
        (SELECT 1 WHERE 
			EXISTS 
			    (SELECT 1 FROM OGP_GroupElement WHERE OGP_ElementID = OGP_Element.ID) 
		) AS IsAllocatedToGroup
	FROM 
	    OGP_Element 
		  INNER JOIN Course ON
		    OGP_Element.CourseID = Course.ID
 	      INNER JOIN OGP_ElementType ON 
		    OGP_Element.OGP_ElementTypeID = OGP_ElementType.ID 
		  LEFT JOIN OGP_Element_Level ON
			OGP_Element.OGP_ElementLevelID = OGP_Element_Level.ID
	WHERE 
		OGP_Element.CourseID = @SelectID
	--  AND
	--    OGP_Element.RecordStatus != 'Obsolete'  // we can now re-order Inactive elements
	ORDER BY 
		DirectParentID, OrderBy;

END
ELSE IF @DataType = 'STUDENTGROUPS'
BEGIN

	SELECT 
		@StudentID = OGP_StudentID 
	FROM 
		OGP_Enrolment 
	WHERE 
		AcademicYearID = @SelectCargo 
	AND 
		StudentRef = @SelectRef;

	IF @StudentID > 0
	BEGIN
		SELECT 
			OGP_GroupEnrolment.ID  AS GroupEnrolmentID, 
			OGP_Group.ID           AS GroupID,
			OGP_Group.OGP_GroupCode, 
			OGP_Group.OGP_GroupTitle
		FROM 
			OGP_GroupEnrolment
				INNER JOIN OGP_Group     ON OGP_Group.ID = OGP_GroupEnrolment.OGP_GroupID
				INNER JOIN OGP_Enrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = OGP_Enrolment.ID
		WHERE
			OGP_Group.AcademicYearID = @SelectCargo
		AND 
			OGP_Enrolment.OGP_StudentID = @StudentID
		AND 
			OGP_Enrolment.RecordStatus <> 'Obsolete' AND OGP_Group.RecordStatus <> 'Obsolete';

	END
	ELSE
	BEGIN
		SELECT 
			Null AS GroupEnrolmentID,
			Null AS GroupID,
			Null AS OGP_GroupCode, 
			Null AS OGP_GroupTitle;

	END

END
ELSE IF @DataType = 'STUDENTVIEW'
BEGIN
	--Note: @SelectID  is OGP_GroupEnrolment.ID
	--Note: @SelectRef is the StudentIndicator: "0" or "1"

	DECLARE @IsStudent BIT;
	SELECT @IsStudent = Convert(bit, @SelectRef)

	--DECLARE @OGP_GroupEnrolmentID AS INTEGER
	SELECT @GroupEnrolmentID = @SelectID;  -- this is OGP_GroupEnrolment.ID returned from 'STUDENTGROUPS'

	--DECLARE @OGP_GroupID AS INTEGER
	SELECT @GroupID = (SELECT OGP_GroupID FROM OGP_GroupEnrolment WHERE OGP_GroupEnrolment.ID = @GroupEnrolmentID);

	--DECLARE @OGP_EnrolmentID AS INTEGER
	SELECT @EnrolmentID = (SELECT OGP_EnrolmentID FROM OGP_GroupEnrolment WHERE OGP_GroupEnrolment.ID = @GroupEnrolmentID);

	SELECT
		OGP_EnrolmentElement.ID,
		COALESCE(OGP_EnrolmentElement.OGP_EnrolmentID, @EnrolmentID) AS OGP_EnrolmentID,
		OGP_GroupElement.OGP_GroupID,
		OGP_GroupElement.DisplayInStudentView,
		OGP_Element.ID AS OGP_ElementID,
		OGP_Element.ElementCode,
		OGP_Element.Description AS ElementDescription,
		OGP_Element.OGP_ElementTypeID,
		OGP_ElementType.Description AS ElementTypeName,
		OGP_ElementType.ElementAlternativeName AS ElementAlternativeName,
		OGP_Element.Size,
		OGP_EnrolmentElement.Complete,
		OGP_EnrolmentElement.Grade,
		OGP_EnrolmentElement.Points,
		OGP_Element.OutOfPoints,
		COALESCE(OGP_GroupElement.DateSet, OGP_EnrolmentElement.DateSet) As DateSet,
		COALESCE(OGP_GroupElement.DateExpected, OGP_EnrolmentElement.DateExpected) As DateExpected,
		OGP_EnrolmentElement.DateMarked,
		OGP_EnrolmentElement.Comment,
		--OGP_EnrolmentElement.FeedbackStaff,
		OGP_EnrolmentElement.FeedbackStudent,
		IsNull(OGP_EnrolmentElement.DoesNotDoElement, 0) AS DoesNotDoElement,
		(SELECT Count(OGP_EnrolmentElementResubmission.ID) FROM OGP_EnrolmentElementResubmission WHERE OGP_EnrolmentElementResubmission.OGP_EnrolmentElementID = OGP_EnrolmentElement.ID) As NumResubmissions,
		T.ElementOrderBy,
		T.IndentLevel

	FROM
		OGP_Element
		INNER JOIN OGP_ElementType ON OGP_Element.OGP_ElementTypeID = OGP_ElementType.ID
		LEFT JOIN OGP_EnrolmentElement ON OGP_EnrolmentElement.OGP_ElementID = OGP_Element.ID
										AND OGP_EnrolmentElement.OGP_EnrolmentID = @EnrolmentID
		LEFT JOIN OGP_Enrolment ON OGP_Enrolment.ID = OGP_EnrolmentElement.OGP_EnrolmentID
										AND OGP_Enrolment.RecordStatus <> 'Obsolete'
		LEFT JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = OGP_Enrolment.ID
										AND OGP_GroupEnrolment.OGP_GroupID = @GroupID
										AND OGP_GroupEnrolment.RecordStatus <> 'Obsolete'
		LEFT JOIN OGP_Group ON OGP_Group.ID = OGP_GroupEnrolment.OGP_GroupID
										AND OGP_Group.RecordStatus <> 'Obsolete'  
		INNER JOIN OGP_GroupElement ON OGP_GroupElement.OGP_ElementID = OGP_Element.ID
										AND OGP_GroupElement.OGP_GroupID = @GroupID
		INNER JOIN
						 --This is a bit of a cheat, but to quickly get the Elements into order, pad the orderby with a lot of zeros to get a tree-like structure (good for almost a billion element recs)
						 (SELECT --these are all the Elements that have been marked and exclude the DoesNotDo
							E.ID AS OGP_ElementID,
							CASE WHEN (E.TopLevelParentID = E.DirectParentID AND E.TopLevelParentID IS NOT NULL) THEN --When = then level2
								RIGHT('0000' + ISNULL(CAST((SELECT OrderBy FROM OGP_Element WHERE OGP_Element.ID= E.TopLevelParentID) AS VARCHAR(4)), '0000'),4) + RIGHT('000000000' + CAST(E.TopLevelParentID AS VARCHAR(9)),9) +
								RIGHT('0000' + CAST(E.OrderBy AS VARCHAR(4)),4) + RIGHT('000000000' + CAST(E.ID AS VARCHAR(9)),9) +
								'0000000000000'
							WHEN (E.TopLevelParentID <> E.DirectParentID AND E.TopLevelParentID IS NOT NULL) THEN  --When <> then level3
								RIGHT('0000' + ISNULL(CAST((SELECT OrderBy FROM OGP_Element WHERE OGP_Element.ID= E.TopLevelParentID) AS VARCHAR(4)), '0000'),4) + RIGHT('000000000' + CAST(E.TopLevelParentID AS VARCHAR(9)),9) +
								RIGHT('0000' + ISNULL(CAST((SELECT OrderBy FROM OGP_Element WHERE OGP_Element.ID= E.DirectParentID) AS VARCHAR(4)), '0000'),4) + RIGHT('000000000' + CAST(E.DirectParentID AS VARCHAR(9)),9) +
								RIGHT('0000' + CAST(E.OrderBy AS VARCHAR(4)),4) + RIGHT('000000000' + CAST(E.ID AS VARCHAR(9)),9)
							ELSE --When null Toplevel, directparent then level1
								RIGHT('0000' + CAST(E.OrderBy AS VARCHAR(4)),4) + RIGHT('000000000' + CAST(E.ID AS VARCHAR(9)),9) +
								'0000000000000' +
								'0000000000000'
							END AS ElementOrderBy,
							CASE WHEN (E.TopLevelParentID = E.DirectParentID AND E.TopLevelParentID IS NOT NULL) THEN --When = then level2
								'Indent_L2'
							WHEN (E.TopLevelParentID <> E.DirectParentID AND E.TopLevelParentID IS NOT NULL) THEN  --When <> then level3
								'Indent_L3'
							ELSE --When null Toplevel, directparent then level1
								'Indent_L1'
							END AS IndentLevel
						  FROM
							OGP_Element E
							LEFT JOIN OGP_GroupElement GE ON E.ID = GE.OGP_ElementID
							INNER JOIN OGP_Group ON OGP_Group.ID = GE.OGP_GroupID
							INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_GroupID = OGP_Group.ID
							INNER JOIN OGP_EnrolmentElement ON OGP_EnrolmentElement.OGP_EnrolmentID = OGP_GroupEnrolment.OGP_EnrolmentID
							AND OGP_EnrolmentElement.OGP_ElementID = E.ID
							AND OGP_GroupEnrolment.ID = @GroupEnrolmentID
							AND OGP_EnrolmentElement.DoesNotDoElement = 0
							--Exclude the Child Elements of any Parent Elements WHERE DoesNotDoElement = 1
							AND OGP_EnrolmentElement.OGP_ElementID NOT IN
							(
								SELECT OGP_Element.ID FROM
											(SELECT OGP_GroupElement.OGP_ElementID
											FROM OGP_GroupElement    INNER JOIN OGP_Element ON OGP_GroupElement.OGP_ElementID = OGP_Element.ID
																	INNER JOIN OGP_EnrolmentElement ON OGP_Element.ID = OGP_EnrolmentElement.OGP_ElementID
											WHERE OGP_GroupElement.OGP_GroupID = @GroupID AND OGP_EnrolmentElement.OGP_EnrolmentID = @EnrolmentID
											AND OGP_EnrolmentElement.DoesNotDoElement = 1) T
								INNER JOIN OGP_Element
									ON OGP_Element.TopLevelParentID = T.OGP_ElementID
								UNION
								SELECT OGP_Element.ID FROM
											(SELECT OGP_GroupElement.OGP_ElementID, TopLevelParentID, DirectParentID
											FROM OGP_GroupElement    INNER JOIN OGP_Element ON OGP_GroupElement.OGP_ElementID = OGP_Element.ID
																	INNER JOIN OGP_EnrolmentElement ON OGP_Element.ID = OGP_EnrolmentElement.OGP_ElementID
											WHERE OGP_GroupElement.OGP_GroupID = @GroupID AND OGP_EnrolmentElement.OGP_EnrolmentID = @EnrolmentID
											AND OGP_EnrolmentElement.DoesNotDoElement = 1) T
								INNER JOIN OGP_Element
									ON OGP_Element.DirectParentID = T.OGP_ElementID
							)

							AND E.RecordStatus <> 'Obsolete' AND OGP_Group.RecordStatus <> 'Obsolete' AND  OGP_GroupEnrolment.RecordStatus <> 'Obsolete'
						UNION --These are the elements in GroupElement, that have no entries in EnrolmentElement (so yet to be marked)
							SELECT
								E.ID AS OGP_ElementID,
								CASE WHEN (E.TopLevelParentID = E.DirectParentID AND E.TopLevelParentID IS NOT NULL) THEN --When = then level2
									RIGHT('0000' + ISNULL(CAST((SELECT OrderBy FROM OGP_Element WHERE OGP_Element.ID= E.TopLevelParentID) AS VARCHAR(4)), '0000'),4) + RIGHT('000000000' + CAST(E.TopLevelParentID AS VARCHAR(9)),9) +
									RIGHT('0000' + CAST(E.OrderBy AS VARCHAR(4)),4) + RIGHT('000000000' + CAST(E.ID AS VARCHAR(9)),9) +
									'0000000000000'
								WHEN (E.TopLevelParentID <> E.DirectParentID AND E.TopLevelParentID IS NOT NULL) THEN  --When <> then level3
									RIGHT('0000' + ISNULL(CAST((SELECT OrderBy FROM OGP_Element WHERE OGP_Element.ID= E.TopLevelParentID) AS VARCHAR(4)), '0000'),4) + RIGHT('000000000' + CAST(E.TopLevelParentID AS VARCHAR(9)),9) +
									RIGHT('0000' + ISNULL(CAST((SELECT OrderBy FROM OGP_Element WHERE OGP_Element.ID= E.DirectParentID) AS VARCHAR(4)), '0000'),4) + RIGHT('000000000' + CAST(E.DirectParentID AS VARCHAR(9)),9) +
									RIGHT('0000' + CAST(E.OrderBy AS VARCHAR(4)),4) + RIGHT('000000000' + CAST(E.ID AS VARCHAR(9)),9)
								ELSE --When null Toplevel, directparent then level1
									RIGHT('0000' + CAST(E.OrderBy AS VARCHAR(4)),4) + RIGHT('000000000' + CAST(E.ID AS VARCHAR(9)),9) +
									'0000000000000' +
									'0000000000000'
								END AS ElementOrderBy,
								CASE WHEN (E.TopLevelParentID = E.DirectParentID AND E.TopLevelParentID IS NOT NULL) THEN --When = then level2
									'Indent_L2'
								WHEN (E.TopLevelParentID <> E.DirectParentID AND E.TopLevelParentID IS NOT NULL) THEN  --When <> then level3
									'Indent_L3'
								ELSE --When null Toplevel, directparent then level1
									'Indent_L1'
								END AS IndentLevel
							FROM
								OGP_Element E
							INNER JOIN OGP_GroupElement ON E.ID = OGP_GroupElement.OGP_ElementID
							WHERE OGP_GroupElement.OGP_GroupID = @GroupID
							AND NOT EXISTS (SELECT EE.OGP_ElementID FROM OGP_EnrolmentElement EE WHERE EE.OGP_EnrolmentID = @EnrolmentID AND E.ID = EE.OGP_ElementID)
							--Exclude the Child Elements of any Parent Elements WHERE DoesNotDoElement = 1
							AND E.ID NOT IN
							(
								SELECT OGP_Element.ID FROM
											(SELECT OGP_GroupElement.OGP_ElementID
											FROM OGP_GroupElement    INNER JOIN OGP_Element ON OGP_GroupElement.OGP_ElementID = OGP_Element.ID
																	INNER JOIN OGP_EnrolmentElement ON OGP_Element.ID = OGP_EnrolmentElement.OGP_ElementID
											WHERE OGP_GroupElement.OGP_GroupID = @GroupID AND OGP_EnrolmentElement.OGP_EnrolmentID = @EnrolmentID
											AND OGP_EnrolmentElement.DoesNotDoElement = 1) T
								INNER JOIN OGP_Element
									ON OGP_Element.TopLevelParentID = T.OGP_ElementID
								UNION
								SELECT OGP_Element.ID FROM
											(SELECT OGP_GroupElement.OGP_ElementID, TopLevelParentID, DirectParentID
											FROM OGP_GroupElement    INNER JOIN OGP_Element ON OGP_GroupElement.OGP_ElementID = OGP_Element.ID
																	INNER JOIN OGP_EnrolmentElement ON OGP_Element.ID = OGP_EnrolmentElement.OGP_ElementID
											WHERE OGP_GroupElement.OGP_GroupID = @GroupID AND OGP_EnrolmentElement.OGP_EnrolmentID = @EnrolmentID
											AND OGP_EnrolmentElement.DoesNotDoElement = 1) T
								INNER JOIN OGP_Element
									ON OGP_Element.DirectParentID = T.OGP_ElementID
							)

						 ) T
						ON OGP_Element.ID = T.OGP_ElementID

    --When Logged in as Staff viewing a Student we can show all Elements
	--When Logged in as Student we must obey DisplayInStudentView
	WHERE
		(@IsStudent = 1 AND OGP_GroupElement.DisplayInStudentView = 1) OR (@IsStudent = 0)
	ORDER BY
		T.ElementOrderBy;


END
ELSE IF @DataType = 'ENROLMENTVIEW_REPLACED_WITH_sp_WebPlus_MarkbookEnrolment_ElementStructure_Select'
BEGIN

	SELECT @EnrolmentID = @SelectID;  
	SELECT @GroupID = Convert(int, @SelectRef);
	SELECT @GroupEnrolmentID = (SELECT ID FROM OGP_GroupEnrolment WHERE OGP_GroupEnrolment.OGP_GroupID = @GroupID AND OGP_GroupEnrolment.OGP_EnrolmentID = @EnrolmentID);
	SELECT @AcademicYearID = (SELECT AcademicYearID FROM OGP_Group WHERE OGP_Group.ID = @GroupID);

	SELECT	
		OGP_EnrolmentElement.ID,
		COALESCE(OGP_EnrolmentElement.OGP_EnrolmentID, @EnrolmentID) AS OGP_EnrolmentID,
		@AcademicYearID AS AcademicYearID,
		OGP_GroupElement.OGP_GroupID,
		OGP_Element.ID AS OGP_ElementID,
		OGP_Element.ElementCode,
		OGP_Element.Description AS ElementDescription,
		OGP_Element.OGP_ElementTypeID,
		OGP_ElementType.Description AS ElementTypeName,
		OGP_ElementType.ElementAlternativeName AS ElementAlternativeName,
		OGP_Element.Size,
		OGP_EnrolmentElement.Complete,
		OGP_EnrolmentElement.Grade,
		OGP_EnrolmentElement.Points,
		OGP_Element.OutOfPoints,
		COALESCE(OGP_GroupElement.DateSet, OGP_EnrolmentElement.DateSet) As DateSet,
		COALESCE(OGP_GroupElement.DateExpected, OGP_EnrolmentElement.DateExpected) As DateExpected,
		OGP_EnrolmentElement.DateMarked,
		OGP_EnrolmentElement.Comment,
		--OGP_EnrolmentElement.FeedbackStaff,
		OGP_EnrolmentElement.FeedbackStudent,
		(SELECT Count(OGP_EnrolmentElementResubmission.ID) FROM OGP_EnrolmentElementResubmission WHERE OGP_EnrolmentElementResubmission.OGP_EnrolmentElementID = OGP_EnrolmentElement.ID) As NumResubmissions,
		T.ElementOrderBy,
		T.IndentLevel

	FROM
		OGP_Element
		INNER JOIN OGP_ElementType ON OGP_Element.OGP_ElementTypeID = OGP_ElementType.ID
		LEFT JOIN OGP_EnrolmentElement ON OGP_EnrolmentElement.OGP_ElementID = OGP_Element.ID
										AND OGP_EnrolmentElement.OGP_EnrolmentID = @EnrolmentID
		LEFT JOIN OGP_Enrolment ON OGP_Enrolment.ID = OGP_EnrolmentElement.OGP_EnrolmentID
										AND OGP_Enrolment.RecordStatus <> 'Obsolete'
		LEFT JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = OGP_Enrolment.ID
										AND OGP_GroupEnrolment.OGP_GroupID = @GroupID
										AND OGP_GroupEnrolment.RecordStatus <> 'Obsolete'
		LEFT JOIN OGP_Group ON OGP_Group.ID = OGP_GroupEnrolment.OGP_GroupID
										AND OGP_Group.RecordStatus <> 'Obsolete'  
		INNER JOIN OGP_GroupElement ON OGP_GroupElement.OGP_ElementID = OGP_Element.ID
										AND OGP_GroupElement.OGP_GroupID = @GroupID
		INNER JOIN
						 --This is a bit of a cheat, but to quickly get the Elements into order, pad the orderby with a lot of zeros to get a tree-like structure (good for almost a billion element recs)
						 (SELECT --these are all the Elements that have been marked and exclude the DoesNotDo
							E.ID AS OGP_ElementID,
							CASE WHEN (E.TopLevelParentID = E.DirectParentID AND E.TopLevelParentID IS NOT NULL) THEN --When = then level2
								RIGHT('0000' + ISNULL(CAST((SELECT OrderBy FROM OGP_Element WHERE OGP_Element.ID= E.TopLevelParentID) AS VARCHAR(4)), '0000'),4) + RIGHT('000000000' + CAST(E.TopLevelParentID AS VARCHAR(9)),9) +
								RIGHT('0000' + CAST(E.OrderBy AS VARCHAR(4)),4) + RIGHT('000000000' + CAST(E.ID AS VARCHAR(9)),9) +
								'0000000000000'
							WHEN (E.TopLevelParentID <> E.DirectParentID AND E.TopLevelParentID IS NOT NULL) THEN  --When <> then level3
								RIGHT('0000' + ISNULL(CAST((SELECT OrderBy FROM OGP_Element WHERE OGP_Element.ID= E.TopLevelParentID) AS VARCHAR(4)), '0000'),4) + RIGHT('000000000' + CAST(E.TopLevelParentID AS VARCHAR(9)),9) +
								RIGHT('0000' + ISNULL(CAST((SELECT OrderBy FROM OGP_Element WHERE OGP_Element.ID= E.DirectParentID) AS VARCHAR(4)), '0000'),4) + RIGHT('000000000' + CAST(E.DirectParentID AS VARCHAR(9)),9) +
								RIGHT('0000' + CAST(E.OrderBy AS VARCHAR(4)),4) + RIGHT('000000000' + CAST(E.ID AS VARCHAR(9)),9)
							ELSE --When null Toplevel, directparent then level1
								RIGHT('0000' + CAST(E.OrderBy AS VARCHAR(4)),4) + RIGHT('000000000' + CAST(E.ID AS VARCHAR(9)),9) +
								'0000000000000' +
								'0000000000000'
							END AS ElementOrderBy,
							CASE WHEN (E.TopLevelParentID = E.DirectParentID AND E.TopLevelParentID IS NOT NULL) THEN --When = then level2
								'Indent_L2'
							WHEN (E.TopLevelParentID <> E.DirectParentID AND E.TopLevelParentID IS NOT NULL) THEN  --When <> then level3
								'Indent_L3'
							ELSE --When null Toplevel, directparent then level1
								'Indent_L1'
							END AS IndentLevel
						  FROM
							OGP_Element E
							LEFT JOIN OGP_GroupElement GE ON E.ID = GE.OGP_ElementID
							INNER JOIN OGP_Group ON OGP_Group.ID = GE.OGP_GroupID
							INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_GroupID = OGP_Group.ID
							INNER JOIN OGP_EnrolmentElement ON OGP_EnrolmentElement.OGP_EnrolmentID = OGP_GroupEnrolment.OGP_EnrolmentID
							AND OGP_EnrolmentElement.OGP_ElementID = E.ID
							AND OGP_GroupEnrolment.ID = @GroupEnrolmentID
							AND OGP_EnrolmentElement.DoesNotDoElement = 0
							--Exclude the Child Elements of any Parent Elements WHERE DoesNotDoElement = 1
							AND OGP_EnrolmentElement.OGP_ElementID NOT IN
							(
								SELECT OGP_Element.ID FROM
											(SELECT OGP_GroupElement.OGP_ElementID
											FROM OGP_GroupElement    INNER JOIN OGP_Element ON OGP_GroupElement.OGP_ElementID = OGP_Element.ID
																	INNER JOIN OGP_EnrolmentElement ON OGP_Element.ID = OGP_EnrolmentElement.OGP_ElementID
											WHERE OGP_GroupElement.OGP_GroupID = @GroupID AND OGP_EnrolmentElement.OGP_EnrolmentID = @EnrolmentID
											AND OGP_EnrolmentElement.DoesNotDoElement = 1) T
								INNER JOIN OGP_Element
									ON OGP_Element.TopLevelParentID = T.OGP_ElementID
								UNION
								SELECT OGP_Element.ID FROM
											(SELECT OGP_GroupElement.OGP_ElementID, TopLevelParentID, DirectParentID
											FROM OGP_GroupElement    INNER JOIN OGP_Element ON OGP_GroupElement.OGP_ElementID = OGP_Element.ID
																	INNER JOIN OGP_EnrolmentElement ON OGP_Element.ID = OGP_EnrolmentElement.OGP_ElementID
											WHERE OGP_GroupElement.OGP_GroupID = @GroupID AND OGP_EnrolmentElement.OGP_EnrolmentID = @EnrolmentID
											AND OGP_EnrolmentElement.DoesNotDoElement = 1) T
								INNER JOIN OGP_Element
									ON OGP_Element.DirectParentID = T.OGP_ElementID
							)

							AND E.RecordStatus <> 'Obsolete' AND OGP_Group.RecordStatus <> 'Obsolete' AND  OGP_GroupEnrolment.RecordStatus <> 'Obsolete'
						UNION --These are the elements in GroupElement, that have no entries in EnrolmentElement (so yet to be marked)
							SELECT
								E.ID AS OGP_ElementID,
								CASE WHEN (E.TopLevelParentID = E.DirectParentID AND E.TopLevelParentID IS NOT NULL) THEN --When = then level2
									RIGHT('0000' + ISNULL(CAST((SELECT OrderBy FROM OGP_Element WHERE OGP_Element.ID= E.TopLevelParentID) AS VARCHAR(4)), '0000'),4) + RIGHT('000000000' + CAST(E.TopLevelParentID AS VARCHAR(9)),9) +
									RIGHT('0000' + CAST(E.OrderBy AS VARCHAR(4)),4) + RIGHT('000000000' + CAST(E.ID AS VARCHAR(9)),9) +
									'0000000000000'
								WHEN (E.TopLevelParentID <> E.DirectParentID AND E.TopLevelParentID IS NOT NULL) THEN  --When <> then level3
									RIGHT('0000' + ISNULL(CAST((SELECT OrderBy FROM OGP_Element WHERE OGP_Element.ID= E.TopLevelParentID) AS VARCHAR(4)), '0000'),4) + RIGHT('000000000' + CAST(E.TopLevelParentID AS VARCHAR(9)),9) +
									RIGHT('0000' + ISNULL(CAST((SELECT OrderBy FROM OGP_Element WHERE OGP_Element.ID= E.DirectParentID) AS VARCHAR(4)), '0000'),4) + RIGHT('000000000' + CAST(E.DirectParentID AS VARCHAR(9)),9) +
									RIGHT('0000' + CAST(E.OrderBy AS VARCHAR(4)),4) + RIGHT('000000000' + CAST(E.ID AS VARCHAR(9)),9)
								ELSE --When null Toplevel, directparent then level1
									RIGHT('0000' + CAST(E.OrderBy AS VARCHAR(4)),4) + RIGHT('000000000' + CAST(E.ID AS VARCHAR(9)),9) +
									'0000000000000' +
									'0000000000000'
								END AS ElementOrderBy,
								CASE WHEN (E.TopLevelParentID = E.DirectParentID AND E.TopLevelParentID IS NOT NULL) THEN --When = then level2
									'Indent_L2'
								WHEN (E.TopLevelParentID <> E.DirectParentID AND E.TopLevelParentID IS NOT NULL) THEN  --When <> then level3
									'Indent_L3'
								ELSE --When null Toplevel, directparent then level1
									'Indent_L1'
								END AS IndentLevel
							FROM
								OGP_Element E
							INNER JOIN OGP_GroupElement ON E.ID = OGP_GroupElement.OGP_ElementID
							WHERE OGP_GroupElement.OGP_GroupID = @GroupID
							AND NOT EXISTS (SELECT EE.OGP_ElementID FROM OGP_EnrolmentElement EE WHERE EE.OGP_EnrolmentID = @EnrolmentID AND E.ID = EE.OGP_ElementID)
							--Exclude the Child Elements of any Parent Elements WHERE DoesNotDoElement = 1
							AND E.ID NOT IN
							(
								SELECT OGP_Element.ID FROM
											(SELECT OGP_GroupElement.OGP_ElementID
											FROM OGP_GroupElement    INNER JOIN OGP_Element ON OGP_GroupElement.OGP_ElementID = OGP_Element.ID
																	INNER JOIN OGP_EnrolmentElement ON OGP_Element.ID = OGP_EnrolmentElement.OGP_ElementID
											WHERE OGP_GroupElement.OGP_GroupID = @GroupID AND OGP_EnrolmentElement.OGP_EnrolmentID = @EnrolmentID
											AND OGP_EnrolmentElement.DoesNotDoElement = 1) T
								INNER JOIN OGP_Element
									ON OGP_Element.TopLevelParentID = T.OGP_ElementID
								UNION
								SELECT OGP_Element.ID FROM
											(SELECT OGP_GroupElement.OGP_ElementID, TopLevelParentID, DirectParentID
											FROM OGP_GroupElement    INNER JOIN OGP_Element ON OGP_GroupElement.OGP_ElementID = OGP_Element.ID
																	INNER JOIN OGP_EnrolmentElement ON OGP_Element.ID = OGP_EnrolmentElement.OGP_ElementID
											WHERE OGP_GroupElement.OGP_GroupID = @GroupID AND OGP_EnrolmentElement.OGP_EnrolmentID = @EnrolmentID
											AND OGP_EnrolmentElement.DoesNotDoElement = 1) T
								INNER JOIN OGP_Element
									ON OGP_Element.DirectParentID = T.OGP_ElementID
							)

						 ) T
						ON OGP_Element.ID = T.OGP_ElementID

	ORDER BY
		T.ElementOrderBy;

END
ELSE IF @DataType = 'RELATEDGROUPS'
BEGIN

	SELECT @EnrolmentID = @SelectID;  
	SELECT @GroupID = Convert(int, @SelectRef);

	SELECT
		@GroupID                       AS SourceGroupID,
		OGP_Enrolment.ID               AS RelatedEnrolmentID, 
		OGP_GroupEnrolment.OGP_GroupID AS RelatedGroupID, --these are the related EnrolmentIDs and GroupIDs.
		OGP_Group.*
	FROM
		OGP_GroupEnrolment
	INNER JOIN OGP_Enrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = OGP_Enrolment.ID
		INNER JOIN (SELECT OGP_Enrolment.StudentRef FROM OGP_Enrolment WHERE OGP_Enrolment.ID = @EnrolmentID) TStudent --Find the Student Ref
			ON OGP_Enrolment.StudentRef = TStudent.StudentRef
			INNER JOIN (SELECT OGP_RelatedGroup.OGP_RelatedGroupID FROM OGP_RelatedGroup WHERE OGP_RelatedGroup.OGP_GroupID = @GroupID) TGroup --Find the related GroupIDs
				ON OGP_GroupEnrolment.OGP_GroupID = TGroup.OGP_RelatedGroupID
				INNER JOIN OGP_Group ON OGP_Group.ID = TGroup.OGP_RelatedGroupID;

	--SELECT 
	--    OGP_RelatedGroup.OGP_GroupID        AS SourceGroupID,
	--	OGP_RelatedGroup.OGP_RelatedGroupID AS RelatedGroupID, 
	--	OGP_Group.* 
	--FROM 
	--	OGP_RelatedGroup
	--		INNER JOIN OGP_Group ON OGP_RelatedGroup.OGP_RelatedGroupID = OGP_Group.ID
	--WHERE
	--	OGP_RelatedGroup.OGP_GroupID = @SelectID
	--AND
	--	OGP_Group.RecordStatus != 'Obsolete'
	--ORDER BY
	--	OGP_Group.AcademicYearID DESC,
	--	OGP_Group.OGP_GroupCode;

END
ELSE IF @DataType = 'MARKBOOKOPTION'
BEGIN

	SELECT 
		ID, Description AS OldDescription,
		Replace(Replace(Replace(Description, @UnitName, @UnitNameAlt), @AssessmentName, @AssessmentNameAlt), @CriteriaName, @CriteriaNameAlt) AS Description,
		IsNull(HelpText, '') AS HelpText,
		OGP_MarkbookOptionDetailID
	FROM 
		OGP_MarkbookOption
	ORDER BY
		ID;

END
ELSE IF @DataType = 'MARKBOOKOPTIONDETAIL'
BEGIN
    --Note: @SelectID is the OptionID

	SELECT 
		ID, MArkbookOptionID, OrderBy, Description AS OldDescription,
		Replace(Replace(Replace(Description, @UnitName, @UnitNameAlt), @AssessmentName, @AssessmentNameAlt), @CriteriaName, @CriteriaNameAlt) AS Description
	FROM 
		OGP_MarkbookOptionDetail
	WHERE
	    MarkbookOptionID = @SelectID
	ORDER BY
		OrderBy;

	--SELECT 
	--	* 
	--FROM 
	--	OGP_MarkbookOptionDetail
	--WHERE
	--    MarkbookOptionID = @SelectID
	--ORDER BY
	--	OrderBy;

END
ELSE IF @DataType = 'MARKBOOKCOURSEOPTION'
BEGIN
    --Note: @SelectID is the OptionID
	--Note: @SelectRef is the CourseID

	SELECT @CourseID = Convert(int, @SelectRef);

	SELECT 
		MarkbookOptionDetailID 
	FROM 
		OGP_MarkbookCourseOption
	WHERE
	    CourseID = @CourseID
	AND
		MarkbookOptionID = @SelectID;
		

END
ELSE IF @DataType = 'GROUPELEMENTSTREEDATA'
BEGIN
	--Note: @SelectID is the GroupID

	SELECT 
		GE.*, 
		ET.Description      AS ElementTypeName,
		ET.ElementAlternativeName,
		E.ID                AS ElementID, 
		E.OGP_ElementTypeID AS ElementTypeID,
		E.ElementCode       AS ElementCode, 
		E.Description       AS ElementDescription, 
		E.RecordStatus, 
		E.DirectParentID, 
		E.TopLevelParentID, 
		E.OrderBy,
		Staff.Forenames              AS StaffForenames,
		Staff.Surname                AS StaffSurname,
		Staff.StaffCode              AS StaffCode
	FROM 
		OGP_GroupElement GE
			INNER JOIN OGP_Element E ON GE.OGP_ElementID = E.ID
				INNER JOIN OGP_ElementType ET ON ET.ID = E.OGP_ElementTypeID
			LEFT JOIN Staff ON Staff.StaffID = GE.StaffID
	WHERE 
		GE.OGP_GroupID = @SelectID
	ORDER BY
		E.DirectParentID, E.OrderBy;

END
ELSE IF @DataType = 'GETAUTOCOMPLETESTATUS'
BEGIN
    --Note: @SelectID  is the CourseID
	--Note: @SelectRef is the ElementID

	SELECT @CourseID = @SelectID;
	SELECT @ElementID = Convert(int, @SelectRef);

	SELECT dbo.fn_GetAutocompleteStatus(@CourseID, @ElementID) As AutoCompleteStatus;

END
ELSE IF @DataType = 'GETAUTOCOMPLETETYPE'
BEGIN
    --Note: @SelectID  is the CourseID
	SELECT @CourseID = @SelectID;

    SELECT TOP 1 
		ISNULL(OD.Description, '') AS AutoCompleteType
    FROM 
		OGP_MarkbookCourseOption CO
			INNER JOIN OGP_MarkbookOptionDetail OD ON CO.MarkbookOptionDetailID = OD.ID
    WHERE 
		CO.CourseID = @CourseID AND CO.MarkbookOptionID = 0;

END

ELSE
BEGIN
	SELECT 'INVALID PARAMETER=' + @DataType AS ERROR_MSG
END

GO




/****** Object:  StoredProcedure [dbo].[sp_WebPlus_MarkBook_GetMarkbookTree]    Script Date: 24/09/2025 09:20:59 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[sp_WebPlus_MarkBook_GetMarkbookTree]
    @GroupID INT,
    @GetRelatedGroups BIT
AS
-- ============================================================================================
-- Author:		Chris CAndeland
-- Create date: 04/04/2025 
-- Descripton:	SP to retrieve the MarkBook Tree Data
-- Modified:    AndyB 24/09/2025 v1.40.1 Added column to return dbo.fn_GetAutocompleteStatus(E.CourseID, E.ID) As AutoCompleteStatus 
-- ============================================================================================
BEGIN
    SET NOCOUNT ON;

    DECLARE @CurrentYearStart INT, @CurrentYearEnd INT;

    -- Parse @CurrentYear to integers for comparison
    SELECT TOP 1 
        @CurrentYearStart = CAST(LEFT(AcademicYearID, 2) AS INT),
        @CurrentYearEnd   = CAST(RIGHT(AcademicYearID, 2) AS INT)
    FROM OGP_Group
    WHERE ID = @GroupID;

    IF @CurrentYearStart IS NULL OR @CurrentYearEnd IS NULL
    BEGIN
        RAISERROR('Invalid or missing AcademicYearID for the provided GroupID.', 16, 1);
        RETURN;
    END;

    ;WITH CriteriaCTE AS (
        SELECT
            E2.DirectParentID,
            E2.ElementCode,
            E2.ID,
            E2.[Description],
            E2.OrderBy
        FROM OGP_Element E2
        INNER JOIN OGP_ElementType ET2 ON E2.OGP_ElementTypeID = ET2.ID
        INNER JOIN dbo.OGP_GroupElement GE ON GE.OGP_ElementID = E2.ID
                                          AND GE.OGP_GroupID   = @GroupID
        WHERE ET2.ID = 3
          AND E2.Recordstatus <> 'Obsolete'
    ),
    RelatedGroupsCTE AS (
        SELECT
            RG.OGP_GroupID        AS GroupID,
            RG.OGP_RelatedGroupID AS RelatedGroupID,
            G.AcademicYearID
        FROM OGP_RelatedGroup RG
        INNER JOIN OGP_Group G ON RG.OGP_RelatedGroupID = G.ID
        WHERE CAST(LEFT(G.AcademicYearID, 2) AS INT)  < @CurrentYearStart
          AND CAST(RIGHT(G.AcademicYearID, 2) AS INT) < @CurrentYearEnd
          AND RG.OGP_GroupID = @GroupID
          AND EXISTS (SELECT 1 FROM OGP_GroupElement GE WHERE GE.OGP_GroupID = RG.OGP_RelatedGroupID)
          AND EXISTS (
                SELECT 1
                FROM OGP_GroupEnrolment ge1
                INNER JOIN OGP_Enrolment e1 ON ge1.OGP_EnrolmentID = e1.ID
                INNER JOIN OGP_Enrolment e2 ON e2.StudentRef       = e1.StudentRef
                INNER JOIN OGP_GroupEnrolment ge2 ON ge2.OGP_EnrolmentID = e2.ID
                WHERE ge1.OGP_GroupID = @GroupID
                  AND ge2.OGP_GroupID = RG.OGP_RelatedGroupID
                  AND @GetRelatedGroups = 1
          )
    ),
    CriteriaRelatedCTE AS ( -- only gets relevant related group criteria
        SELECT
            E2.DirectParentID,
            E2.ElementCode,
            E2.ID,
            E2.[Description],
            E2.OrderBy
        FROM OGP_Element E2
        INNER JOIN OGP_ElementType ET2 ON E2.OGP_ElementTypeID = ET2.ID
        INNER JOIN dbo.OGP_GroupElement GE ON GE.OGP_ElementID = E2.ID
        WHERE GE.OGP_GroupID IN (SELECT RelatedGroupID FROM RelatedGroupsCTE)
          AND E2.Recordstatus <> 'Obsolete'
          AND @GetRelatedGroups = 1
    ),
    OriginalGroups AS (
        SELECT
            E.ID            AS ElementID,
            E.ElementCode,
            ET.ID           AS ElementTypeID,
            E.[Description] AS ElementDescription,
            E.DirectParentID AS ParentElementID,
			dbo.fn_GetAutocompleteStatus(E.CourseID, E.ID) As AutoCompleteStatus,
            ParentE.ElementCode AS ParentElementCode,
            STUFF((
                SELECT ', ' + C.ElementCode
                FROM CriteriaCTE C
                WHERE C.DirectParentID = E.ID
                ORDER BY C.OrderBy
                FOR XML PATH(''), TYPE
            ).value('.','NVARCHAR(MAX)'),1,2,'') AS ChildCriteriaCodes,
            STUFF((
                SELECT ', ' + CAST(C.ID AS VARCHAR(10))
                FROM CriteriaCTE C
                WHERE C.DirectParentID = E.ID
                ORDER BY C.OrderBy
                FOR XML PATH(''), TYPE
            ).value('.','NVARCHAR(MAX)'),1,2,'') AS ChildCriteriaIDs,

            -- JSON (SQL 2014-compatible emulation of FOR JSON PATH)
            ISNULL((
                SELECT '[' +
                    STUFF((
                        SELECT ',' + (
                            SELECT
                                '{' +
                                '"ID":' + CAST(C.ID AS NVARCHAR(20)) + ',' +
                                '"ElementCode":"' + REPLACE(REPLACE(ISNULL(C.ElementCode,''), '\','\\'), '"','\"') + '",' +
                                '"Description":"' + REPLACE(REPLACE(ISNULL(C.[Description],''), '\','\\'), '"','\"') + '"' +
                                '}'
                            FOR XML PATH(''), TYPE
                        ).value('.','NVARCHAR(MAX)')
                        FROM CriteriaCTE C
                        WHERE C.DirectParentID = E.ID
                        ORDER BY C.OrderBy
                        FOR XML PATH(''), TYPE
                    ).value('.','NVARCHAR(MAX)'),1,1,'')
                + ']'
            ), '[]') AS ChildCriteriaJSON,

            CAST(0 AS BIT) AS IsRelatedGroup,
            E.OrderBy,
            GE.OGP_GroupID,         -- for debugging
            NULL        AS RelatedGroupID,
            E.OutOfPoints,
            E.Size      AS ElementSize,
            L.ElementLevelName,
            NULL        AS RelatedAcadYr
        FROM OGP_Element E
        INNER JOIN OGP_ElementType ET ON E.OGP_ElementTypeID = ET.ID
        LEFT  JOIN OGP_Element ParentE ON E.DirectParentID = ParentE.ID
        LEFT  JOIN OGP_GroupElement GE ON E.ID = GE.OGP_ElementID
        LEFT  JOIN OGP_Element_Level L ON L.ID = E.OGP_ElementLevelID
        WHERE ET.ID <> 3     -- 3 is criteria
          AND GE.OGP_GroupID = @GroupID
          AND E.Recordstatus <> 'Obsolete'
    ),
    RelatedGroups AS (
        SELECT
            E.ID            AS ElementID,
            E.ElementCode,
            ET.ID           AS ElementTypeID,
            E.[Description] AS ElementDescription,
            E.DirectParentID AS ParentElementID,
			dbo.fn_GetAutocompleteStatus(E.CourseID, E.ID) As AutoCompleteStatus,
            ParentE.ElementCode AS ParentElementCode,
            STUFF((
                SELECT ', ' + C.ElementCode
                FROM CriteriaRelatedCTE C
                WHERE C.DirectParentID = E.ID
                ORDER BY C.OrderBy
                FOR XML PATH(''), TYPE
            ).value('.','NVARCHAR(MAX)'),1,2,'') AS ChildCriteriaCodes,
            STUFF((
                SELECT ', ' + CAST(C.ID AS VARCHAR(10))
                FROM CriteriaRelatedCTE C
                WHERE C.DirectParentID = E.ID
                ORDER BY C.OrderBy
                FOR XML PATH(''), TYPE
            ).value('.','NVARCHAR(MAX)'),1,2,'') AS ChildCriteriaIDs,

            -- JSON (SQL 2014-compatible emulation)
            ISNULL((
                SELECT '[' +
                    STUFF((
                        SELECT ',' + (
                            SELECT
                                '{' +
                                '"ID":' + CAST(C.ID AS NVARCHAR(20)) + ',' +
                                '"ElementCode":"' + REPLACE(REPLACE(ISNULL(C.ElementCode,''), '\','\\'), '"','\"') + '",' +
                                '"Description":"' + REPLACE(REPLACE(ISNULL(C.[Description],''), '\','\\'), '"','\"') + '"' +
                                '}'
                            FOR XML PATH(''), TYPE
                        ).value('.','NVARCHAR(MAX)')
                        FROM CriteriaRelatedCTE C
                        WHERE C.DirectParentID = E.ID
                        ORDER BY C.OrderBy
                        FOR XML PATH(''), TYPE
                    ).value('.','NVARCHAR(MAX)'),1,1,'')
                + ']'
            ), '[]') AS ChildCriteriaJSON,

            CAST(1 AS BIT) AS IsRelatedGroup,
            E.OrderBy,
            GE.OGP_GroupID,          -- for debugging
            RG.GroupID AS RelatedGroupID,
            E.OutOfPoints,
            E.Size      AS ElementSize,
            L.ElementLevelName,
            RG.AcademicYearID AS RelatedAcadYr
        FROM OGP_Element E
        INNER JOIN OGP_ElementType ET ON E.OGP_ElementTypeID = ET.ID
        LEFT  JOIN OGP_Element ParentE ON E.DirectParentID = ParentE.ID
        LEFT  JOIN OGP_GroupElement GE ON E.ID = GE.OGP_ElementID
        LEFT  JOIN RelatedGroupsCTE RG ON RG.RelatedGroupID = GE.OGP_GroupID
        LEFT  JOIN OGP_Element_Level L ON L.ID = E.OGP_ElementLevelID
        WHERE ET.ID <> 3            -- 3 is criteria
          AND RG.RelatedGroupID IS NOT NULL
          AND @GetRelatedGroups = 1
          AND E.Recordstatus <> 'Obsolete'
    )
    SELECT *
    FROM OriginalGroups
    UNION ALL
    SELECT *
    FROM RelatedGroups
    ORDER BY RelatedGroupID DESC, OrderBy, ParentElementCode, ElementCode;
END;
GO




/****** Object:  StoredProcedure [dbo].[sp_WebPlus_DeltaMaint_Categories_Update]    Script Date: 01/10/2025 10:14:13 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_WebPlus_DeltaMaint_Categories_Update]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_WebPlus_DeltaMaint_Categories_Update] AS' 
END
GO

ALTER PROCEDURE [dbo].[sp_WebPlus_DeltaMaint_Categories_Update]
  @StaffId                  INT,
  @ID                       INT,
  @DisplayName              VARCHAR(100),
  @ShortDisplayName         VARCHAR(12),
  @Weighting                Decimal(19,2),
  @IsActive                 BIT,
  @IsExternalDataSource     BIT,
  @ContributeToStudentScore BIT,
  @OrderBy                  Int
AS
-- =======================================================================================
-- Author:		Andy Breward
-- Create date: 01/10/2025 
-- Descripton:	SP to save a Delta Category
-- Example:     exec sp_WebPlus_DeltaMaint_Categories_Update 2, 1, 'Attendance', 'Att', 3.00, 1, 1, 1,1
-- =======================================================================================

SET NOCOUNT ON;

DECLARE  @VALUE_FALSE BIT = 0;
DECLARE  @VALUE_TRUE  BIT = 1;

DECLARE @RowcountReturn INT = 0;  -- default return value 0=no changes

DECLARE @Updated        DATETIME = GetDate();
DECLARE @ChangesToSave  BIT = @VALUE_FALSE;

DECLARE @UserName       VARCHAR(255);
DECLARE @UserForenames  VARCHAR(100);
DECLARE @UserSurname    VARCHAR(100);

DECLARE @RowDescription VARCHAR(500);
DECLARE @TypeOfChange   VARCHAR(50);

DECLARE @DisplayName_Existing               VARCHAR(100);
DECLARE @ShortDisplayName_Existing          VARCHAR(12);
DECLARE @Weighting_Existing                 Decimal(19,2);
DECLARE @IsActive_Existing                  Bit;
DECLARE @IsExternalDataSource_Existing      Bit;
DECLARE @ContributeToStudentScore_Existing  Bit;
DECLARE @OrderBy_Existing                   Int;

DECLARE @ID_Existing             INT;
DECLARE @ID_New                  INT;


IF EXISTS (SELECT 1 FROM Staff WHERE StaffID = @StaffId)
BEGIN
    --Get the Staff Username
    SELECT 
		@UserName = [User].UserName,
		@UserForenames = [User].Forenames,
		@UserSurname = [User].Surname
    FROM Staff 
		INNER JOIN [User] ON [User].UserID = Staff.UserID
    WHERE 
	    StaffID = @StaffId;

  IF @ID > 0 
  BEGIN
    -- ******************************************************************
    --   Update Delta Category (Delta_Category)
    -- ******************************************************************
    SET @ChangesToSave = @VALUE_FALSE;

    IF EXISTS (SELECT 1 FROM Delta_Category WHERE ID = @ID)
	BEGIN

		--get the existing values
		SELECT
		  @DisplayName_Existing               = DisplayName,
		  @ShortDisplayName_Existing          = ShortDisplayName,
		  @Weighting_Existing                 = Weighting,
		  @IsActive_Existing                  = IsActive,
		  @IsExternalDataSource_Existing      = IsExternalDataSource,
		  @ContributeToStudentScore_Existing  = ContributeToStudentScore,
		  @OrderBy_Existing                   = OrderBy
		FROM
		  Delta_Category
		WHERE
		  ID = @ID;

		--Check for Updates 
		IF IsNull(@DisplayName,'') != IsNull(@DisplayName_Existing,'')
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF IsNull(@ShortDisplayName,'') != IsNull(@ShortDisplayName_Existing,'')
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @Weighting != @Weighting_Existing
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @IsActive != @IsActive_Existing
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @IsExternalDataSource != @IsExternalDataSource_Existing
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @ContributeToStudentScore != @ContributeToStudentScore_Existing
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @OrderBy != @OrderBy_Existing
		  SET @ChangesToSave = @VALUE_TRUE;

		IF @ChangesToSave = @VALUE_TRUE
		BEGIN
		  Print 'Performing Update';

		  --Update changes
  		  UPDATE 
			Delta_Category
		  SET
			DisplayName               = @DisplayName,
			ShortDisplayName          = @ShortDisplayName,
			Weighting                 = @Weighting,
			IsActive                  = @IsActive,
			IsExternalDataSource      = @IsExternalDataSource,
			ContributeToStudentScore  = @ContributeToStudentScore,
			OrderBy                   = @OrderBy
		  WHERE
			ID = @ID;

		  --set return to number of rows updated
		  SET @RowcountReturn = 1;   -- @@ROWCOUNT;

		  --now update the Audit
		  SET @TypeOfChange    = 'UPDATE';
		  SET @RowDescription  = 'Updated ID ' + Convert(VARCHAR, @ID);

		  IF @DisplayName != @DisplayName_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'Delta_Category',  @ID,            @RowDescription,  'DisplayName', null,        null,   @DisplayName_Existing,  @DisplayName);
		  END
		  IF @ShortDisplayName != @ShortDisplayName_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'Delta_Category',  @ID,            @RowDescription,  'ShortDisplayName', null,        null,   @ShortDisplayName_Existing,  @ShortDisplayName);
		  END
		  IF @Weighting != @Weighting_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'Delta_Category',  @ID,            @RowDescription,  'Weighting', null,        null,   Convert(VARCHAR, @Weighting_Existing),  Convert(VARCHAR, @Weighting));
		  END
		  IF @IsActive != @IsActive_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'Delta_Category',  @ID,            @RowDescription,  'IsActive', null,        null,   Convert(VARCHAR, @IsActive_Existing),  Convert(VARCHAR, @IsActive));
		  END
		  IF @IsExternalDataSource != @IsExternalDataSource_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'Delta_Category',  @ID,            @RowDescription,  'IsExternalDataSource', null,        null,   Convert(VARCHAR, @IsExternalDataSource_Existing),  Convert(VARCHAR, @IsExternalDataSource));
		  END
		  IF @ContributeToStudentScore != @ContributeToStudentScore_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'Delta_Category',  @ID,            @RowDescription,  'ContributeToStudentScore', null,        null,   Convert(VARCHAR, @ContributeToStudentScore_Existing),  Convert(VARCHAR, @ContributeToStudentScore));
		  END
		  IF @OrderBy != @OrderBy_Existing BEGIN
			  INSERT INTO AuditTrail 
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,    OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'Delta_Category',  @ID,            @RowDescription,  'OrderBy',  null,        null,   Convert(VARCHAR, @OrderBy_Existing),  Convert(VARCHAR, @OrderBy));
		  END

		END
		ELSE
		BEGIN
			--No Changes so return 0
			SET @RowcountReturn = 0;
		END
    END
	ELSE
	BEGIN
		--ID not found so return -1
		SET @RowcountReturn = -1;
	END
  END  

END   
ELSE
BEGIN
    Print 'StaffID not found';

    -- set return to -2 to indicate StaffID not found
    SET @RowcountReturn = -2;
END

--return number of rows updated (or -'ve error)
SELECT @RowcountReturn AS ReturnValue;
GO





/****** Object:  StoredProcedure [dbo].[sp_WebPlus_DeltaMaint_CategoryBanding_Update]    Script Date: 03/10/2025 13:15:32 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_WebPlus_DeltaMaint_CategoryBanding_Update]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_WebPlus_DeltaMaint_CategoryBanding_Update] AS' 
END
GO

ALTER PROCEDURE [dbo].[sp_WebPlus_DeltaMaint_CategoryBanding_Update]
  @StaffId          INTEGER,
  @ID               INTEGER,         -- 0=New,   +'ve indicates UPDATE,   -'ve indicates DELETE
  @DeltaCategoryID  INTEGER,
  @DeltaScoreName   VARCHAR(50),
  @DeltaScore       INTEGER = 0,
  @MinValue         Decimal(19,2) = 0,
  @MaxValue         Decimal(19,2) = 0
AS
-- ====================================================================
-- Author:		Andy Breward
-- Create date: 03/10/2025 
-- Descripton:	SP to Create, Update or Delete a Delta CategoryBanding 
-- ====================================================================
DECLARE @returnValue INT = 0;

DECLARE @Updated      DATETIME = GetDate();

DECLARE @VALUE_FALSE BIT = 0;
DECLARE @VALUE_TRUE  BIT = 1;

DECLARE @UserName       VARCHAR(255);
DECLARE @UserForenames  VARCHAR(100);
DECLARE @UserSurname    VARCHAR(100);

DECLARE @RowDescription VARCHAR(500);
DECLARE @TypeOfChange   VARCHAR(50);

DECLARE @ChangesToSave BIT = @VALUE_FALSE;

DECLARE @DeltaCategoryID_Existing INTEGER;
DECLARE @DeltaScoreName_Existing  VARCHAR(50);
DECLARE @DeltaScore_Existing      INTEGER;
DECLARE @Min_Existing             Decimal(19,2);
DECLARE @Max_Existing             Decimal(19,2);

DECLARE @NewValueType VARCHAR(50);
DECLARE @NewValueDescr VARCHAR(5000);

--***********************************************************************************

IF EXISTS (SELECT 1 FROM Staff WHERE StaffID = @StaffId)
BEGIN

  --Get the Staff Username
  SELECT 
		@UserName = [User].UserName,
		@UserForenames = [User].Forenames,
		@UserSurname = [User].Surname
  FROM Staff 
		INNER JOIN [User] ON [User].UserID = Staff.UserID
  WHERE 
	    StaffID = @StaffId;

  IF @ID = 0
  BEGIN
	  -- *****************************************
      --  INSERT 'Delta_Category_Banding' record
	  -- *****************************************

	  INSERT INTO Delta_Category_Banding 
		(DeltaCategoryID, DeltaScoreName, Score, Min, Max)
	  VALUES
  		(@DeltaCategoryID, @DeltaScoreName, @DeltaScore,  @MinValue,  @MaxValue); 

      --get the new ID
	  SELECT @returnValue = SCOPE_IDENTITY();

      SET @TypeOfChange    = 'INSERT';
	  SET @RowDescription  = 'Inserted ID ' + Convert(VARCHAR, @returnValue);

 	  INSERT INTO AuditTrail
	    (AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,        OldValue, NewValue,  OldValueDescription, NewValueDescription)
	  VALUES
	    (@Updated, @UserName, @TypeOfChange, 'Delta_Category_Banding',  @ID,        @RowDescription,  'DeltaScoreName', null,     null,      null,               @DeltaScoreName);

  END
  ELSE
  BEGIN
      -- +'ve ID indicates UPDATE,   -'ve ID indicates DELETE

	  IF EXISTS (SELECT 1 FROM Delta_Category_Banding WHERE ID = Abs(@ID))
	  BEGIN

		  --Get the Existing Details 
		  SELECT
		    @DeltaCategoryID_Existing  = Delta_Category_Banding.DeltaCategoryID,
			@DeltaScoreName_Existing   = Delta_Category_Banding.DeltaScoreName,
			@DeltaScore_Existing       = Delta_Category_Banding.Score,
			@Min_Existing              = Delta_Category_Banding.Min,
			@Max_Existing              = Delta_Category_Banding.Max
		  FROM
			Delta_Category_Banding
		  WHERE
			Delta_Category_Banding.ID = Abs(@ID);

		  IF @ID > 0
		  BEGIN
		      -- *****************************************
			  --  Update 'Delta_Category_Banding' record
		      -- *****************************************

			  --Check for Updates 
			  IF @DeltaCategoryID != @DeltaCategoryID_Existing
				SET @ChangesToSave = @VALUE_TRUE;
		      ELSE IF @DeltaScoreName != @DeltaScoreName_Existing
				SET @ChangesToSave = @VALUE_TRUE;
		      ELSE IF @DeltaScore != @DeltaScore_Existing
				SET @ChangesToSave = @VALUE_TRUE;
		      ELSE IF @MinValue != @Min_Existing
				SET @ChangesToSave = @VALUE_TRUE;
		      ELSE IF @MaxValue != @Max_Existing
				SET @ChangesToSave = @VALUE_TRUE;

			  IF @ChangesToSave = @VALUE_TRUE
			  BEGIN
				  SET @TypeOfChange    = 'UPDATE';
				  SET @RowDescription  = 'Updated ID ' + Convert(VARCHAR, @ID);

				  --Update
				  UPDATE 
					Delta_Category_Banding 
				  SET 
		            DeltaCategoryID    = @DeltaCategoryID,
					DeltaScoreName     = @DeltaScoreName,
					Score              = @DeltaScore,
					Min                = @MinValue,
					Max                = @MaxValue  
				  WHERE
					ID = @ID;

				  --set the return value as the ID updated
				  SET @returnValue = Abs(@ID);

					--  Create Audit entries for the changed fields
					IF @DeltaCategoryID != @DeltaCategoryID_Existing BEGIN
					  INSERT INTO OGP_MarkbookStructureAudit 
						(AuditDate, AuditBy,   AuditChange,   TableName,                   RowID,  RowDescription,  CourseName,  GroupCode,  ElementName,  FieldName,   OldValueDescription, NewValueDescription)
					  VALUES
						(@Updated, @UserName, @TypeOfChange, 'Delta_Category_Banding', @ID,   @RowDescription,  null,        null,       null,        'DeltaCategoryID',   @DeltaCategoryID_Existing,  @DeltaCategoryID);
					END
					IF @DeltaScoreName != @DeltaScoreName_Existing BEGIN
					  INSERT INTO OGP_MarkbookStructureAudit 
						(AuditDate, AuditBy,   AuditChange,   TableName,                   RowID,  RowDescription,  CourseName,  GroupCode,  ElementName,  FieldName,   OldValueDescription, NewValueDescription)
					  VALUES
						(@Updated, @UserName, @TypeOfChange, 'Delta_Category_Banding', @ID,   @RowDescription,  null,        null,       null,        'DeltaScoreName',   @DeltaScoreName_Existing,  @DeltaScoreName);
					END
					IF @DeltaScore != @DeltaScore_Existing BEGIN
					  INSERT INTO OGP_MarkbookStructureAudit 
						(AuditDate, AuditBy,   AuditChange,   TableName,                   RowID,  RowDescription,  CourseName,  GroupCode,  ElementName,  FieldName,   OldValueDescription, NewValueDescription)
					  VALUES
						(@Updated, @UserName, @TypeOfChange, 'Delta_Category_Banding', @ID,   @RowDescription,  null,        null,       null,        'DeltaScore',   @DeltaScore_Existing,  @DeltaScore);
					END
					IF @MinValue != @Min_Existing BEGIN
					  INSERT INTO OGP_MarkbookStructureAudit 
						(AuditDate, AuditBy,   AuditChange,   TableName,                   RowID,  RowDescription,  CourseName,  GroupCode,  ElementName,  FieldName,   OldValueDescription, NewValueDescription)
					  VALUES
						(@Updated, @UserName, @TypeOfChange, 'Delta_Category_Banding', @ID,   @RowDescription,  null,        null,       null,        'Min',   @Min_Existing,  @MinValue);
					END
					IF @MaxValue != @Max_Existing BEGIN
					  INSERT INTO OGP_MarkbookStructureAudit 
						(AuditDate, AuditBy,   AuditChange,   TableName,                   RowID,  RowDescription,  CourseName,  GroupCode,  ElementName,  FieldName,   OldValueDescription, NewValueDescription)
					  VALUES
						(@Updated, @UserName, @TypeOfChange, 'Delta_Category_Banding', @ID,   @RowDescription,  null,        null,       null,        'Max',   @Max_Existing,  @MaxValue);
					END

			  END
			  ELSE
			  BEGIN
				  -- set return to 0 to indicate no changes
				  SET @returnValue = 0;
			  END

		  END
		  ELSE
		  BEGIN
		      -- *****************************************
			  --  DELETE 'Delta_Category_Banding' record
		      -- *****************************************

			  SET @ChangesToSave   = @VALUE_TRUE;
			  SET @TypeOfChange    = 'DELETE';
			  SET @RowDescription  = 'Deleted ID ' + Convert(VARCHAR, Abs(@ID));

  			  --Perform the Delete
			  DELETE FROM 
			    Delta_Category_Banding 
			  WHERE 
			    ID = Abs(@ID);

			  --set the return value as the ID updated
			  SET @returnValue = Abs(@ID);

			  --  Create Audit entry
			  INSERT INTO OGP_MarkbookStructureAudit 
				(AuditDate, AuditBy,   AuditChange,   TableName,                   RowID,       RowDescription,  CourseName,  GroupCode,  ElementName,  FieldName,   OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'Delta_Category_Banding', Abs(@ID),   @RowDescription,  null,        null,       null,        '',           null, null);

		  END

	  END
	  ELSE
	  BEGIN
		-- set return to -1 to indicate ID not found
		SET @returnValue = -1;
	  END

  END

END
ELSE
BEGIN
    -- set return to -2 to indicate StaffID not found
    SET @returnValue = -2;
END


SELECT @returnValue;
GO




/****** Object:  StoredProcedure [dbo].[sp_WebPlus_DeltaMaint_StartDate_Update]    Script Date: 04/10/2025 11:14:04 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_WebPlus_DeltaMaint_StartDate_Update]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_WebPlus_DeltaMaint_StartDate_Update] AS' 
END
GO

ALTER PROCEDURE [dbo].[sp_WebPlus_DeltaMaint_StartDate_Update]
  @StaffId                  INT,
  @ID                       INT,
  @StartDate                DATETIME
AS
-- =======================================================================================
-- Author:		Andy Breward
-- Create date: 04/10/2025 
-- Descripton:	SP to save a Delta StartDate
-- =======================================================================================

SET NOCOUNT ON;

DECLARE  @VALUE_FALSE BIT = 0;
DECLARE  @VALUE_TRUE  BIT = 1;

DECLARE @RowcountReturn INT = 0;  -- default return value 0=no changes

DECLARE @Updated        DATETIME = GetDate();
DECLARE @ChangesToSave  BIT = @VALUE_FALSE;

DECLARE @UserName       VARCHAR(255);
DECLARE @UserForenames  VARCHAR(100);
DECLARE @UserSurname    VARCHAR(100);

DECLARE @RowDescription VARCHAR(500);
DECLARE @TypeOfChange   VARCHAR(50);

DECLARE @StartDate_Existing      DATETIME;

DECLARE @ID_Existing             INT;
DECLARE @ID_New                  INT;


IF EXISTS (SELECT 1 FROM Staff WHERE StaffID = @StaffId)
BEGIN
    --Get the Staff Username
    SELECT 
		@UserName = [User].UserName,
		@UserForenames = [User].Forenames,
		@UserSurname = [User].Surname
    FROM Staff 
		INNER JOIN [User] ON [User].UserID = Staff.UserID
    WHERE 
	    StaffID = @StaffId;

  IF @ID > 0 
  BEGIN
    -- ******************************************************************
    --   Update Delta StartDate (Delta_AcYrWeek1StartDate)
    -- ******************************************************************
    SET @ChangesToSave = @VALUE_FALSE;

    IF EXISTS (SELECT 1 FROM Delta_AcYrWeek1StartDate WHERE ID = @ID)
	BEGIN

		--get the existing values
		SELECT
		  @StartDate_Existing               = StartDate
		FROM
		  Delta_AcYrWeek1StartDate
		WHERE
		  ID = @ID;

		--Check for Updates 
		IF @StartDate != @StartDate_Existing
		  SET @ChangesToSave = @VALUE_TRUE;

		IF @ChangesToSave = @VALUE_TRUE
		BEGIN
		  Print 'Performing Update';

		  --Update changes
  		  UPDATE 
			Delta_AcYrWeek1StartDate
		  SET
			StartDate               = @StartDate
		  WHERE
			ID = @ID;

		  --set return to number of rows updated
		  SET @RowcountReturn = 1;   -- @@ROWCOUNT;

		  --now update the Audit
		  SET @TypeOfChange    = 'UPDATE';
		  SET @RowDescription  = 'Updated ID ' + Convert(VARCHAR, @ID);

		  IF @StartDate != @StartDate_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'Delta_AcYrWeek1StartDate',  @ID,            @RowDescription,  'StartDate', null,        null,   Convert(VARCHAR, @StartDate_Existing),  Convert(VARCHAR, @StartDate));
		  END

		END
		ELSE
		BEGIN
			--No Changes so return 0
			SET @RowcountReturn = 0;
		END
    END
	ELSE
	BEGIN
		--ID not found so return -1
		SET @RowcountReturn = -1;
	END
  END  

END   
ELSE
BEGIN
    Print 'StaffID not found';

    -- set return to -2 to indicate StaffID not found
    SET @RowcountReturn = -2;
END

--return number of rows updated (or -'ve error)
SELECT @RowcountReturn AS ReturnValue;
GO




/****** Object:  StoredProcedure [dbo].[sp_WebPlus_DeltaMaint_InfoFlags_Update]    Script Date: 08/10/2025 14:34:29 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_WebPlus_DeltaMaint_InfoFlags_Update]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_WebPlus_DeltaMaint_InfoFlags_Update] AS' 
END
GO

ALTER PROCEDURE [dbo].[sp_WebPlus_DeltaMaint_InfoFlags_Update]
  @StaffId                  INT,
  @ID                       INT,
  @DisplayName              VARCHAR(100),
  @ShortDisplayName         VARCHAR(12),
  @IsActive                 BIT
AS
-- =======================================================================================
-- Author:		Andy Breward
-- Create date: 01/10/2025 
-- Descripton:	SP to save a Delta InfoFlag (Delta_Student_InformationFlag_Definition)
-- =======================================================================================

SET NOCOUNT ON;

DECLARE  @VALUE_FALSE BIT = 0;
DECLARE  @VALUE_TRUE  BIT = 1;

DECLARE @RowcountReturn INT = 0;  -- default return value 0=no changes

DECLARE @Updated        DATETIME = GetDate();
DECLARE @ChangesToSave  BIT = @VALUE_FALSE;

DECLARE @UserName       VARCHAR(255);
DECLARE @UserForenames  VARCHAR(100);
DECLARE @UserSurname    VARCHAR(100);

DECLARE @RowDescription VARCHAR(500);
DECLARE @TypeOfChange   VARCHAR(50);

DECLARE @DisplayName_Existing               VARCHAR(100);
DECLARE @ShortDisplayName_Existing          VARCHAR(12);
DECLARE @IsActive_Existing                  Bit;

DECLARE @ID_Existing             INT;
DECLARE @ID_New                  INT;


IF EXISTS (SELECT 1 FROM Staff WHERE StaffID = @StaffId)
BEGIN
    --Get the Staff Username
    SELECT 
		@UserName = [User].UserName,
		@UserForenames = [User].Forenames,
		@UserSurname = [User].Surname
    FROM Staff 
		INNER JOIN [User] ON [User].UserID = Staff.UserID
    WHERE 
	    StaffID = @StaffId;

  IF @ID > 0 
  BEGIN
    -- ******************************************************************
    --   Update Delta InfoFlag (Delta_Student_InformationFlag_Definition)
    -- ******************************************************************
    SET @ChangesToSave = @VALUE_FALSE;

    IF EXISTS (SELECT 1 FROM Delta_Student_InformationFlag_Definition WHERE ID = @ID)
	BEGIN

		--get the existing values
		SELECT
		  @DisplayName_Existing               = DisplayName,
		  @ShortDisplayName_Existing          = ShortDisplayName,
		  @IsActive_Existing                  = IsVisible
		FROM
		  Delta_Student_InformationFlag_Definition
		WHERE
		  ID = @ID;

		--Check for Updates 
		IF IsNull(@DisplayName,'') != IsNull(@DisplayName_Existing,'')
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF IsNull(@ShortDisplayName,'') != IsNull(@ShortDisplayName_Existing,'')
		  SET @ChangesToSave = @VALUE_TRUE;
		ELSE IF @IsActive != @IsActive_Existing
		  SET @ChangesToSave = @VALUE_TRUE;

		IF @ChangesToSave = @VALUE_TRUE
		BEGIN
		  Print 'Performing Update';

		  --Update changes
  		  UPDATE 
			Delta_Student_InformationFlag_Definition
		  SET
			DisplayName               = @DisplayName,
			ShortDisplayName          = @ShortDisplayName,
			IsVisible                 = @IsActive
		  WHERE
			ID = @ID;

		  --set return to number of rows updated
		  SET @RowcountReturn = 1;   -- @@ROWCOUNT;

		  --now update the Audit
		  SET @TypeOfChange    = 'UPDATE';
		  SET @RowDescription  = 'Updated ID ' + Convert(VARCHAR, @ID);

		  IF @DisplayName != @DisplayName_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'Delta_Student_InformationFlag_Definition',  @ID,            @RowDescription,  'DisplayName', null,        null,   @DisplayName_Existing,  @DisplayName);
		  END
		  IF @ShortDisplayName != @ShortDisplayName_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'Delta_Student_InformationFlag_Definition',  @ID,            @RowDescription,  'ShortDisplayName', null,        null,   @ShortDisplayName_Existing,  @ShortDisplayName);
		  END
		  IF @IsActive != @IsActive_Existing BEGIN
			  INSERT INTO AuditTrail
				(AuditDate, AuditBy,   AuditChange,   TableName,             RowID,          RowDescription,  FieldName,                OldValue, NewValue,  OldValueDescription, NewValueDescription)
			  VALUES
				(@Updated, @UserName, @TypeOfChange, 'Delta_Student_InformationFlag_Definition',  @ID,            @RowDescription,  'IsVisible', null,        null,   Convert(VARCHAR, @IsActive_Existing),  Convert(VARCHAR, @IsActive));
		  END

		END
		ELSE
		BEGIN
			--No Changes so return 0
			SET @RowcountReturn = 0;
		END
    END
	ELSE
	BEGIN
		--ID not found so return -1
		SET @RowcountReturn = -1;
	END
  END  

END   
ELSE
BEGIN
    Print 'StaffID not found';

    -- set return to -2 to indicate StaffID not found
    SET @RowcountReturn = -2;
END

--return number of rows updated (or -'ve error)
SELECT @RowcountReturn AS ReturnValue;
GO




/****** Object:  StoredProcedure [dbo].[sp_WebPlus_DeltaMaint_Select]    Script Date: 05/10/2025 10:12:20 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_WebPlus_DeltaMaint_Select]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_WebPlus_DeltaMaint_Select] AS' 
END
GO

ALTER PROCEDURE [dbo].[sp_WebPlus_DeltaMaint_Select]
  @DataType    VARCHAR(50),
  @SelectRef   VARCHAR(50) = NULL,
  @SelectCargo VARCHAR(50) = NULL
AS
-- ============================================================================================
-- Author:		Andrew Breward
-- Create date: 25/09/2025 
-- Descripton:	SP to retrieve the Delta Maint data (specified by @DataType parameter)
--
-- Examples:    exec sp_WebPlus_SystemMaint_Select 'DELTACATEGORIES'
--              exec sp_WebPlus_SystemMaint_Select 'DELTACATEGORYBANDINGS'
--              exec sp_WebPlus_SystemMaint_Select 'DELTASTARTDATES'
--              exec sp_WebPlus_SystemMaint_Select 'DELTASTUDENTINFOFLAGS'
--
-- ============================================================================================

DECLARE @CourseID         INT = 0;
DECLARE @StudentID        INT = 0;
DECLARE @EnrolmentID      INT = 0;
DECLARE @GroupID          INT = 0;
DECLARE @ElementID        INT = 0;
DECLARE @GroupEnrolmentID INT = 0;
DECLARE @AcademicYearID   VARCHAR(5) = '';

IF (@DataType = 'DELTACATEGORIES')
BEGIN
	SELECT 
	  *
	FROM 
	  Delta_Category
	ORDER BY
	  OrderBy;

END
ELSE IF (@DataType = 'DELTACATEGORYBANDINGS')
BEGIN
	SELECT 
	  dcb.*, 
	  dc.DisplayName AS CategoryDisplayName, 
	  dc.SystemName AS CategorySystemName, 
	  dc.ShortDisplayName AS CategoryShortDisplayName
	FROM 
	  Delta_Category_Banding dcb
	    INNER JOIN Delta_Category dc ON dcb.DeltaCategoryID = dc.ID
	ORDER BY
	  dc.OrderBy, dcb.Score DESC;

END
ELSE IF (@DataType = 'DELTASTARTDATES')
BEGIN

	SELECT 
		Delta_AcYrWeek1StartDate.* 
	FROM 
		Delta_AcYrWeek1StartDate
	ORDER BY 
		AcademicYearID Desc;

END
ELSE IF (@DataType = 'DELTASTUDENTINFOFLAGS')
BEGIN

	SELECT 
		Delta_Student_InformationFlag_Definition.* 
	FROM 
		Delta_Student_InformationFlag_Definition
	ORDER BY 
		ID;
END

ELSE
BEGIN
	SELECT 'INVALID PARAMETER=' + @DataType AS ERROR_MSG
END

GO






/****** Object:  StoredProcedure [dbo].[sp_WebPlus_EMStudents_Select]    Script Date: 08/10/2025 13:03:39 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



ALTER PROCEDURE [dbo].[sp_WebPlus_EMStudents_Select]
@AcademicYearID   VARCHAR(5),
@EngMatType       VARCHAR(7),
@SearchType       VARCHAR(11),   -- GROUP or COURSE or LEARNINGAIM
@SearchCode       VARCHAR(255)   -- @SearchCode increased to 255 to cater for long Department Names

AS
-- ========================================================================================================================
-- Author:		Andrew Breward
-- Create date: AndyB 20/03/2024
-- Descripton:	SP to retrieve the Students for a GROUP or COURSE or LEARNINGAIM
-- Example:     exec sp_WebPlus_EMStudents_Select '22/23', 'English', 'GROUP', '28038W2 28038W2_GpC'
-- Modified:	AndyG  30/07/2023  OR statements were imacting performance, so each SearchType now treated separately
--              AndyB  07/12/2023  Added CollegeStructure field
--              AndyB  04/03/2024  Added TOP (@MaxRecords)
--                                 Added Department SearchType
--              AndyB  20/03/2024  Added CourseID
--              AndyB  09/10/2024 Changed: @SearchCode increased to 255 to cater for long Department Names
--              AndyB  05/02/2022 Changed: Added IsStudentInSync to list of fields (se we can tell if data needs summarising)
--              AndyB  08/10/2025 v1.40.1 Added Cumulative fields 
--
-- ========================================================================================================================

DECLARE @MaxRecords INT;
SET @MaxRecords = (SELECT 
                     IsNull(SystemSettingValue, DefaultValue) AS SystemSettingValue   
				   FROM 
				     SystemSettingValue 
				   WHERE 
				     SystemSettingName = 'WebPlusMaxAllowedStudentsGrid');
IF IsNull(@MaxRecords, 0) <= 0 SET @MaxRecords = 1000;

Print 'Max Records: ' + STR(@MaxRecords);
Print 'SearchType: ' + @SearchType;


--****************************************************************************************
--                              G R O U P
--****************************************************************************************
IF @SearchType = 'GROUP'
BEGIN

SELECT TOP (@MaxRecords) * FROM
(
SELECT TOP (@MaxRecords)
    EngMat_Enrolment_InYear.ID, 
	OGP_Enrolment.ID AS EnrolmentID, 
    EngMat_Enrolment_InYear.StudentRef, 
	EngMat_Enrolment_InYear.Surname, 
	EngMat_Enrolment_InYear.Forenames, 
	EngMat_Enrolment_InYear.AgeOn31Aug, 
	EngMat_Enrolment_InYear.Gender, 
	EngMat_Enrolment_InYear.Ethnicity, 
	EngMat_Enrolment_InYear.DOB,
	EngMat_Enrolment_InYear.EngMatType, /*Instead of VA_Type, We have EngMatType which is 'English' or 'Maths'*/
	EngMat_Enrolment_InYear.OutcomeDescription,
	EngMat_Enrolment_InYear.OutcomeID,
	EngMat_Enrolment_InYear.CollegeStructure,
	EngMat_Enrolment_InYear.CurrentYear,
	EngMat_Enrolment_InYear.StartDate, 
	EngMat_Enrolment_InYear.PlannedEndDate, 
	EngMat_Enrolment_InYear.ActualEndDate, 
	EngMat_Enrolment_InYear.PriorAttainment_KS4,
	EngMat_Enrolment_InYear.StartQOE_HighestGrade,
	EngMat_Enrolment_InYear.StartQOE_HighestQualType,
	EngMat_Enrolment_InYear.StartInfo,
	EngMat_Enrolment_InYear.WDNumDaysAfterStart,
	EngMat_Enrolment_InYear.CappedPoints, 
	EngMat_Enrolment_InYear.Approved,
	--EngMat_Enrolment_InYear.Size, n/a
	--EngMat_Enrolment_InYear.Duration,  n/a
	--EngMat_Enrolment_InYear.Cohort,  n/a
	EngMat_Enrolment_InYear.NotionalNVQLevel, /*NotionalNVQLevel replaces NVQLevel*/
    EngMat_Enrolment_InYear.TeachingGroupCode, 
	EngMat_Enrolment_InYear.TeachingGroupTitle,
	OGP_Group.ID AS TeachingGroupID,
	Course.ID AS CourseID,
	EngMat_Enrolment_InYear.CourseCode, 
	EngMat_Enrolment_InYear.CourseTitle, 
	EngMat_Enrolment_InYear.LearningAimRef, 
	EngMat_Enrolment_InYear.LearningAimRefTitle AS LearningAimTitle,  /*LearningAimRefTitle instead of LearningAimTitle*/
	--EngMat_Enrolment_InYear.Qualification,  n/a
	--EngMat_Enrolment_InYear.QualificationCodeandName, n/a
	EngMat_Enrolment_InYear.MostRecentIYGrade, /* MostRecentIYGrade instead of IYMostRecentGrade*/
	 --EngMat_Enrolment_InYear.IYMostRecentGradeNo, --n/a
	 EngMat_Enrolment_InYear.MostRecentIYPoints, --added (The Points the IY Grade is equivalent to)
	--COALESCE (EngMat_Enrolment_InYear.QOEPoints_College2dp, EngMat_Enrolment_InYear.QOEPoints_GCSE_College2dp) AS QOEPoints,  Not Used
	EngMat_Enrolment_InYear.StartPoints, --added (Starting Points - i.e. QOE points)
	EngMat_Enrolment_InYear.StartPointsInfo, --added (Starting Point Info)
	EngMat_Enrolment_InYear.MaximumAvailablePoints, --added (The maximum number of points possible for this LearningAim)
	EngMat_Enrolment_InYear.MaxPotentialProgress, --added (The maximum Progress the student can make. i.e. MAxAvailablePoints - StartPoints)
	EngMat_Enrolment_InYear.TargetGrade, --added (The next grade up from the Starting Points)
	EngMat_Enrolment_InYear.TargetPoints, --added (The points that the Target Grade is worth)
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGrade,  --n/a.  We don't have a national target grade
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGradeInflated,  --n/a.  Wwe don't have an inflated national target grade
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEGrade,
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEPoints,
	EngMat_Enrolment_InYear.CompletionStatus AS CompletionDescription, /*was CompletionDescription*/
	EngMat_Enrolment_InYear.CompletionID,
	EngMat_Enrolment_InYear.IYGrade1/*was Point1_Grade*/, EngMat_Enrolment_InYear.Point1_Notes, EngMat_Enrolment_InYear.IYPoints1,
	EngMat_Enrolment_InYear.IYGrade2/*was Point2_Grade*/, EngMat_Enrolment_InYear.Point2_Notes, EngMat_Enrolment_InYear.IYPoints2,
	EngMat_Enrolment_InYear.IYGrade3/*was Point3_Grade*/, EngMat_Enrolment_InYear.Point3_Notes, EngMat_Enrolment_InYear.IYPoints3, 
	EngMat_Enrolment_InYear.IYGrade4/*was Point4_Grade*/, EngMat_Enrolment_InYear.Point4_Notes, EngMat_Enrolment_InYear.IYPoints4,
	EngMat_Enrolment_InYear.IYGrade5/*was Point5_Grade*/, EngMat_Enrolment_InYear.Point5_Notes, EngMat_Enrolment_InYear.IYPoints5,
	EngMat_Enrolment_InYear.IYGrade6/*was Point6_Grade*/, EngMat_Enrolment_InYear.Point6_Notes, EngMat_Enrolment_InYear.IYPoints6,
	EngMat_Enrolment_InYear.IYGrade7/*was Point7_Grade*/, EngMat_Enrolment_InYear.Point7_Notes, EngMat_Enrolment_InYear.IYPoints7,
	EngMat_Enrolment_InYear.IYGrade8/*was Point8_Grade*/, EngMat_Enrolment_InYear.Point8_Notes, EngMat_Enrolment_InYear.IYPoints8,
	EngMat_Enrolment_InYear.IYGrade9/*was Point9_Grade*/, EngMat_Enrolment_InYear.Point9_Notes, EngMat_Enrolment_InYear.IYPoints9,
	EngMat_Enrolment_InYear.IYGrade10/*was Point10_Grade*/, EngMat_Enrolment_InYear.Point10_Notes, EngMat_Enrolment_InYear.IYPoints10,
	EngMat_Enrolment_InYear.IYGrade11/*was Point11_Grade*/, EngMat_Enrolment_InYear.Point11_Notes, EngMat_Enrolment_InYear.IYPoints11,
	EngMat_Enrolment_InYear.IYGrade12/*was Point12_Grade*/, EngMat_Enrolment_InYear.Point12_Notes, EngMat_Enrolment_InYear.IYPoints12,
	EngMat_Enrolment_InYear.Point1_EffortDescription, 
	EngMat_Enrolment_InYear.Point2_EffortDescription, 
	EngMat_Enrolment_InYear.Point3_EffortDescription, 
	EngMat_Enrolment_InYear.Point4_EffortDescription, 
	EngMat_Enrolment_InYear.Point5_EffortDescription, 
	EngMat_Enrolment_InYear.Point6_EffortDescription, 
	EngMat_Enrolment_InYear.Point7_EffortDescription, 
	EngMat_Enrolment_InYear.Point8_EffortDescription, 
	EngMat_Enrolment_InYear.Point9_EffortDescription, 
	EngMat_Enrolment_InYear.Point10_EffortDescription, 
	EngMat_Enrolment_InYear.Point11_EffortDescription, 
	EngMat_Enrolment_InYear.Point12_EffortDescription, 
	EngMat_Enrolment_InYear.PersonalTargetGrade,
	EngMat_Enrolment_InYear.EnrolmentGrade,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget2dp AS InYearValueAdded,
	EngMat_Enrolment_InYear.IYProgressMostRecent,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget_NationalBanding AS InYearValueAdddedvsNat, --n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent2dp AS FinalValueAdded,--n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent_NationalBanding AS FinalValueAddedvsNat,--n/a
	EngMat_Enrolment_InYear.Progress,/*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points*/
	EngMat_Enrolment_InYear.CappedProgress, /*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points, but if negative, it can only be -1*/
	--dbo.fn_WebPlusDetermineOriginOfQOEForOGPlus(EstActVA.ID) AS OriginOfQOEText, --n/a
	--dbo.fn_WebPlusGetInyearValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, IYMostRecentGrade, IYMostRecentPoints, MostRecentCollegeEstPoints2dp, IYMostRecent_vs_RecentTarget2dp) AS InyearValueAddedPopupInfo,--n/a
	--dbo.fn_WebPlusGetFinalValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, EnrolmentGrade, EnrolmentPoints, MostRecentCollegeEstPoints2dp, EnrolmentGradeVAScore_vs_MostRecent2dp) AS FinalValueAddedPopupInfo--n/a
    --
    --v1.40.1 Cumulative fields added
	EngMat_Enrolment_InYear.CumulativeStartPoints,
	EngMat_Enrolment_InYear.CumulativeProgress,
	EngMat_Enrolment_InYear.CumulativeCappedProgress,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestGrade,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestQualType,
	EngMat_Enrolment_InYear.CumulativeStartInfo,
	EngMat_Enrolment_InYear.CumulativeMaxPotentialProgress,
	EngMat_Enrolment_InYear.CumulativeTargetGrade,
	EngMat_Enrolment_InYear.CumulativeTargetPoints,
	EngMat_Enrolment_InYear.CumulativeIYProgressMostRecent,
	EngMat_Enrolment_InYear.CumulativeIYProgress1,
	EngMat_Enrolment_InYear.CumulativeIYProgress2,
	EngMat_Enrolment_InYear.CumulativeIYProgress3,
	EngMat_Enrolment_InYear.CumulativeIYProgress4,
	EngMat_Enrolment_InYear.CumulativeIYProgress5,
	EngMat_Enrolment_InYear.CumulativeIYProgress6,
	EngMat_Enrolment_InYear.CumulativeIYProgress7,
	EngMat_Enrolment_InYear.CumulativeIYProgress8,
	EngMat_Enrolment_InYear.CumulativeIYProgress9,
	EngMat_Enrolment_InYear.CumulativeIYProgress10,
	EngMat_Enrolment_InYear.CumulativeIYProgress11,
	EngMat_Enrolment_InYear.CumulativeIYProgress12,
	CASE
		WHEN (SELECT vEngMatEnrolment.ID FROM vEngMatEnrolment WHERE EngMat_Enrolment_InYear.ID = vEngMatEnrolment.ID AND EngMat_Enrolment_InYear.AcademicYearID = vEngMatEnrolment.AcademicYearID AND EngMat_Enrolment_InYear.StudentRef = vEngMatEnrolment.StudentRef AND EngMat_Enrolment_InYear.CourseCode = vEngMatEnrolment.CourseCode) IS NULL THEN 0
		ELSE 1
	END AS IsStudentInSync,
	--
	'IMPORTED' AS RecordStatus
FROM
    EngMat_Enrolment_InYear
		INNER JOIN Course ON EngMat_Enrolment_InYear.CourseCode = Course.CourseCode AND EngMat_Enrolment_InYear.AcademicYearID = Course.AcademicYearID
			INNER JOIN OGP_Enrolment ON Course.ID = OGP_Enrolment.CourseID AND OGP_Enrolment.CourseID = OGP_Enrolment.OriginalCourseID  AND EngMat_Enrolment_InYear.StudentRef = OGP_Enrolment.StudentRef  -- added
				--INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = OGP_Enrolment.ID
				--	INNER JOIN OGP_Group ON OGP_Group.ID = OGP_GroupEnrolment.OGP_GroupID AND OGP_Group.OGP_TypeCode = @EngMatType 
				INNER JOIN OGP_Group ON (OGP_Group.OGP_GroupCode = EngMat_Enrolment_InYear.TeachingGroupCode AND 
				                         OGP_Group.OGP_TypeCode = @EngMatType AND 
										 OGP_Group.CourseID = OGP_Enrolment.CourseID AND
										 OGP_Group.AcademicYearID = @AcademicYearID)
WHERE 
	EngMat_Enrolment_InYear.TeachingGroupCode = @SearchCode
AND 
	EngMat_Enrolment_InYear.AcademicYearID = @AcademicYearID
AND 
	OGP_Enrolment.RecordStatus = 'Imported'
AND 
	EngMat_Enrolment_InYear.EngMatType = @EngMatType

UNION --UNION EngMat_Enrolment_InYear info from Enrolments in Adhoc Teaching Groups

SELECT TOP (@MaxRecords)
    EngMat_Enrolment_InYear.ID, 
	OGP_Enrolment.ID AS EnrolmentID, 
    EngMat_Enrolment_InYear.StudentRef, 
	EngMat_Enrolment_InYear.Surname, 
	EngMat_Enrolment_InYear.Forenames, 
	EngMat_Enrolment_InYear.AgeOn31Aug, 
	EngMat_Enrolment_InYear.Gender, 
	EngMat_Enrolment_InYear.Ethnicity, 
	EngMat_Enrolment_InYear.DOB,
	EngMat_Enrolment_InYear.EngMatType, /*Instead of VA_Type, We have EngMatType which is 'English' or 'Maths'*/
	EngMat_Enrolment_InYear.OutcomeDescription,
	EngMat_Enrolment_InYear.OutcomeID,
	EngMat_Enrolment_InYear.CollegeStructure,
	EngMat_Enrolment_InYear.CurrentYear,
	EngMat_Enrolment_InYear.StartDate, 
	EngMat_Enrolment_InYear.PlannedEndDate, 
	EngMat_Enrolment_InYear.ActualEndDate, 
	EngMat_Enrolment_InYear.PriorAttainment_KS4,
	EngMat_Enrolment_InYear.StartQOE_HighestGrade,
	EngMat_Enrolment_InYear.StartQOE_HighestQualType,
	EngMat_Enrolment_InYear.StartInfo,
	EngMat_Enrolment_InYear.WDNumDaysAfterStart,
	EngMat_Enrolment_InYear.CappedPoints, 
	EngMat_Enrolment_InYear.Approved,
	--EngMat_Enrolment_InYear.Size, n/a
	--EngMat_Enrolment_InYear.Duration,  n/a
	--EngMat_Enrolment_InYear.Cohort,  n/a
	EngMat_Enrolment_InYear.NotionalNVQLevel, /*NotionalNVQLevel replaces NVQLevel*/
    OGP_Group.OGP_GroupCode AS TeachingGroupCode, 
	OGP_Group.OGP_GroupTitle AS TeachingGroupTitle,
	OGP_Group.ID AS TeachingGroupID,
	Course.ID AS CourseID,
	EngMat_Enrolment_InYear.CourseCode, 
	EngMat_Enrolment_InYear.CourseTitle, 
	EngMat_Enrolment_InYear.LearningAimRef, 
	EngMat_Enrolment_InYear.LearningAimRefTitle AS LearningAimTitle,   /*LearningAimRefTitle instead of LearningAimTitle*/
	--EngMat_Enrolment_InYear.Qualification,  n/a
	--EngMat_Enrolment_InYear.QualificationCodeandName, n/a
	EngMat_Enrolment_InYear.MostRecentIYGrade, /* MostRecentIYGrade instead of IYMostRecentGrade*/
	 --EngMat_Enrolment_InYear.IYMostRecentGradeNo, --n/a
	 EngMat_Enrolment_InYear.MostRecentIYPoints, --added (The Points the IY Grade is equivalent to)
	--COALESCE (EngMat_Enrolment_InYear.QOEPoints_College2dp, EngMat_Enrolment_InYear.QOEPoints_GCSE_College2dp) AS QOEPoints,  Not Used
	EngMat_Enrolment_InYear.StartPoints, --added (Starting Points - i.e. QOE points)
	EngMat_Enrolment_InYear.StartPointsInfo, --added (Starting Point Info)
	EngMat_Enrolment_InYear.MaximumAvailablePoints, --added (The maximum number of points possible for this LearningAim)
	EngMat_Enrolment_InYear.MaxPotentialProgress, --added (The maximum Progress the student can make. i.e. MAxAvailablePoints - StartPoints)
	EngMat_Enrolment_InYear.TargetGrade, --added (The next grade up from the Starting Points)
	EngMat_Enrolment_InYear.TargetPoints, --added (The points that the Target Grade is worth)
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGrade,  --n/a.  We don't have a national target grade
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGradeInflated,  --n/a.  Wwe don't have an inflated national target grade
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEGrade,
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEPoints,
	EngMat_Enrolment_InYear.CompletionStatus, /*was CompletionDescription*/
	EngMat_Enrolment_InYear.CompletionID,
	EngMat_Enrolment_InYear.IYGrade1/*was Point1_Grade*/, EngMat_Enrolment_InYear.Point1_Notes, EngMat_Enrolment_InYear.IYPoints1,
	EngMat_Enrolment_InYear.IYGrade2/*was Point2_Grade*/, EngMat_Enrolment_InYear.Point2_Notes, EngMat_Enrolment_InYear.IYPoints2,
	EngMat_Enrolment_InYear.IYGrade3/*was Point3_Grade*/, EngMat_Enrolment_InYear.Point3_Notes, EngMat_Enrolment_InYear.IYPoints3,
	EngMat_Enrolment_InYear.IYGrade4/*was Point4_Grade*/, EngMat_Enrolment_InYear.Point4_Notes, EngMat_Enrolment_InYear.IYPoints4,
	EngMat_Enrolment_InYear.IYGrade5/*was Point5_Grade*/, EngMat_Enrolment_InYear.Point5_Notes, EngMat_Enrolment_InYear.IYPoints5,
	EngMat_Enrolment_InYear.IYGrade6/*was Point6_Grade*/, EngMat_Enrolment_InYear.Point6_Notes, EngMat_Enrolment_InYear.IYPoints6,
	EngMat_Enrolment_InYear.IYGrade7/*was Point7_Grade*/, EngMat_Enrolment_InYear.Point7_Notes, EngMat_Enrolment_InYear.IYPoints7,
	EngMat_Enrolment_InYear.IYGrade8/*was Point8_Grade*/, EngMat_Enrolment_InYear.Point8_Notes, EngMat_Enrolment_InYear.IYPoints8,
	EngMat_Enrolment_InYear.IYGrade9/*was Point9_Grade*/, EngMat_Enrolment_InYear.Point9_Notes, EngMat_Enrolment_InYear.IYPoints9,
	EngMat_Enrolment_InYear.IYGrade10/*was Point10_Grade*/, EngMat_Enrolment_InYear.Point10_Notes, EngMat_Enrolment_InYear.IYPoints10,
	EngMat_Enrolment_InYear.IYGrade11/*was Point11_Grade*/, EngMat_Enrolment_InYear.Point11_Notes, EngMat_Enrolment_InYear.IYPoints11,
	EngMat_Enrolment_InYear.IYGrade12/*was Point12_Grade*/, EngMat_Enrolment_InYear.Point12_Notes, EngMat_Enrolment_InYear.IYPoints12,
	EngMat_Enrolment_InYear.Point1_EffortDescription, 
	EngMat_Enrolment_InYear.Point2_EffortDescription, 
	EngMat_Enrolment_InYear.Point3_EffortDescription, 
	EngMat_Enrolment_InYear.Point4_EffortDescription, 
	EngMat_Enrolment_InYear.Point5_EffortDescription, 
	EngMat_Enrolment_InYear.Point6_EffortDescription, 
	EngMat_Enrolment_InYear.Point7_EffortDescription, 
	EngMat_Enrolment_InYear.Point8_EffortDescription, 
	EngMat_Enrolment_InYear.Point9_EffortDescription, 
	EngMat_Enrolment_InYear.Point10_EffortDescription, 
	EngMat_Enrolment_InYear.Point11_EffortDescription, 
	EngMat_Enrolment_InYear.Point12_EffortDescription, 
	EngMat_Enrolment_InYear.PersonalTargetGrade,
	EngMat_Enrolment_InYear.EnrolmentGrade,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget2dp AS InYearValueAdded,
	EngMat_Enrolment_InYear.IYProgressMostRecent,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget_NationalBanding AS InYearValueAdddedvsNat, --n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent2dp AS FinalValueAdded,--n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent_NationalBanding AS FinalValueAddedvsNat,--n/a
	EngMat_Enrolment_InYear.Progress, /*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points*/
	EngMat_Enrolment_InYear.CappedProgress, /*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points, but if negative, it can only be -1*/
	--dbo.fn_WebPlusDetermineOriginOfQOEForOGPlus(EstActVA.ID) AS OriginOfQOEText, --n/a
	--dbo.fn_WebPlusGetInyearValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, IYMostRecentGrade, IYMostRecentPoints, MostRecentCollegeEstPoints2dp, IYMostRecent_vs_RecentTarget2dp) AS InyearValueAddedPopupInfo,--n/a
	--dbo.fn_WebPlusGetFinalValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, EnrolmentGrade, EnrolmentPoints, MostRecentCollegeEstPoints2dp, EnrolmentGradeVAScore_vs_MostRecent2dp) AS FinalValueAddedPopupInfo--n/a
    --
    --v1.40.1 Cumulative fields added
	EngMat_Enrolment_InYear.CumulativeStartPoints,  
	EngMat_Enrolment_InYear.CumulativeProgress,
	EngMat_Enrolment_InYear.CumulativeCappedProgress,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestGrade,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestQualType,
	EngMat_Enrolment_InYear.CumulativeStartInfo,
	EngMat_Enrolment_InYear.CumulativeMaxPotentialProgress,
	EngMat_Enrolment_InYear.CumulativeTargetGrade,
	EngMat_Enrolment_InYear.CumulativeTargetPoints,
	EngMat_Enrolment_InYear.CumulativeIYProgressMostRecent,
	EngMat_Enrolment_InYear.CumulativeIYProgress1,
	EngMat_Enrolment_InYear.CumulativeIYProgress2,
	EngMat_Enrolment_InYear.CumulativeIYProgress3,
	EngMat_Enrolment_InYear.CumulativeIYProgress4,
	EngMat_Enrolment_InYear.CumulativeIYProgress5,
	EngMat_Enrolment_InYear.CumulativeIYProgress6,
	EngMat_Enrolment_InYear.CumulativeIYProgress7,
	EngMat_Enrolment_InYear.CumulativeIYProgress8,
	EngMat_Enrolment_InYear.CumulativeIYProgress9,
	EngMat_Enrolment_InYear.CumulativeIYProgress10,
	EngMat_Enrolment_InYear.CumulativeIYProgress11,
	EngMat_Enrolment_InYear.CumulativeIYProgress12,
	CASE
		WHEN (SELECT vEngMatEnrolment.ID FROM vEngMatEnrolment WHERE EngMat_Enrolment_InYear.ID = vEngMatEnrolment.ID AND EngMat_Enrolment_InYear.AcademicYearID = vEngMatEnrolment.AcademicYearID AND EngMat_Enrolment_InYear.StudentRef = vEngMatEnrolment.StudentRef AND EngMat_Enrolment_InYear.CourseCode = vEngMatEnrolment.CourseCode) IS NULL THEN 0
		ELSE 1
	END AS IsStudentInSync,
	--
	'ADHOC' AS RecordStatus
FROM
	EngMat_Enrolment_InYear
		INNER JOIN Course ON EngMat_Enrolment_InYear.CourseCode = Course.CourseCode AND EngMat_Enrolment_InYear.AcademicYearID = Course.AcademicYearID
			INNER JOIN OGP_Enrolment ON Course.ID = OGP_Enrolment.OriginalCourseID AND EngMat_Enrolment_InYear.StudentRef = OGP_Enrolment.StudentRef  --Link to OriginalCourseID because we want the Original VA (values, LAim, Course)
				INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = OGP_Enrolment.ID
					INNER JOIN OGP_Group ON OGP_Group.ID = OGP_GroupEnrolment.OGP_GroupID AND OGP_Group.OGP_TypeCode = @EngMatType 
WHERE
	OGP_Group.OGP_GroupCode = @SearchCode
AND 
	EngMat_Enrolment_InYear.AcademicYearID = @AcademicYearID
AND 
	OGP_Group.RecordStatus = 'Adhoc'
AND 
	OGP_GroupEnrolment.RecordStatus = 'Adhoc'
AND 
	EngMat_Enrolment_InYear.EngMatType = @EngMatType
) union_query
ORDER BY 
	4,5,3   -- Surname,Forename,StudentRef

END


--****************************************************************************************
--                              C O U R S E
--****************************************************************************************
IF @SearchType = 'COURSE'
BEGIN

SELECT TOP (@MaxRecords) * FROM
(
SELECT TOP (@MaxRecords)
    EngMat_Enrolment_InYear.ID, 
	OGP_Enrolment.ID AS EnrolmentID, 
    EngMat_Enrolment_InYear.StudentRef, 
	EngMat_Enrolment_InYear.Surname, 
	EngMat_Enrolment_InYear.Forenames, 
	EngMat_Enrolment_InYear.AgeOn31Aug, 
	EngMat_Enrolment_InYear.Gender, 
	EngMat_Enrolment_InYear.Ethnicity, 
	EngMat_Enrolment_InYear.DOB,
	EngMat_Enrolment_InYear.EngMatType, /*Instead of VA_Type, We have EngMatType which is 'English' or 'Maths'*/
	EngMat_Enrolment_InYear.OutcomeDescription,
	EngMat_Enrolment_InYear.OutcomeID,
	EngMat_Enrolment_InYear.CollegeStructure,
	EngMat_Enrolment_InYear.CurrentYear,
	EngMat_Enrolment_InYear.StartDate, 
	EngMat_Enrolment_InYear.PlannedEndDate, 
	EngMat_Enrolment_InYear.ActualEndDate, 
	EngMat_Enrolment_InYear.PriorAttainment_KS4,
	EngMat_Enrolment_InYear.StartQOE_HighestGrade,
	EngMat_Enrolment_InYear.StartQOE_HighestQualType,
	EngMat_Enrolment_InYear.StartInfo,
	EngMat_Enrolment_InYear.WDNumDaysAfterStart,
	EngMat_Enrolment_InYear.CappedPoints, 
	EngMat_Enrolment_InYear.Approved,
	--EngMat_Enrolment_InYear.Size, n/a
	--EngMat_Enrolment_InYear.Duration,  n/a
	--EngMat_Enrolment_InYear.Cohort,  n/a
	EngMat_Enrolment_InYear.NotionalNVQLevel, /*NotionalNVQLevel replaces NVQLevel*/
    EngMat_Enrolment_InYear.TeachingGroupCode, 
	EngMat_Enrolment_InYear.TeachingGroupTitle,
	OGP_Group.ID AS TeachingGroupID,
	Course.ID AS CourseID,
	EngMat_Enrolment_InYear.CourseCode, 
	EngMat_Enrolment_InYear.CourseTitle, 
	EngMat_Enrolment_InYear.LearningAimRef, 
	EngMat_Enrolment_InYear.LearningAimRefTitle AS LearningAimTitle,  /*LearningAimRefTitle instead of LearningAimTitle*/
	--EngMat_Enrolment_InYear.Qualification,  n/a
	--EngMat_Enrolment_InYear.QualificationCodeandName, n/a
	EngMat_Enrolment_InYear.MostRecentIYGrade, /* MostRecentIYGrade instead of IYMostRecentGrade*/
	 --EngMat_Enrolment_InYear.IYMostRecentGradeNo, --n/a
	 EngMat_Enrolment_InYear.MostRecentIYPoints, --added (The Points the IY Grade is equivalent to)
	--COALESCE (EngMat_Enrolment_InYear.QOEPoints_College2dp, EngMat_Enrolment_InYear.QOEPoints_GCSE_College2dp) AS QOEPoints,  Not Used
	EngMat_Enrolment_InYear.StartPoints, --added (Starting Points - i.e. QOE points)
	EngMat_Enrolment_InYear.StartPointsInfo, --added (Starting Point Info)
	EngMat_Enrolment_InYear.MaximumAvailablePoints, --added (The maximum number of points possible for this LearningAim)
	EngMat_Enrolment_InYear.MaxPotentialProgress, --added (The maximum Progress the student can make. i.e. MAxAvailablePoints - StartPoints)
	EngMat_Enrolment_InYear.TargetGrade, --added (The next grade up from the Starting Points)
	EngMat_Enrolment_InYear.TargetPoints, --added (The points that the Target Grade is worth)
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGrade,  --n/a.  We don't have a national target grade
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGradeInflated,  --n/a.  Wwe don't have an inflated national target grade
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEGrade,
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEPoints,
	EngMat_Enrolment_InYear.CompletionStatus AS CompletionDescription, /*was CompletionDescription*/
	EngMat_Enrolment_InYear.CompletionID,
	EngMat_Enrolment_InYear.IYGrade1/*was Point1_Grade*/, EngMat_Enrolment_InYear.Point1_Notes, EngMat_Enrolment_InYear.IYPoints1,
	EngMat_Enrolment_InYear.IYGrade2/*was Point2_Grade*/, EngMat_Enrolment_InYear.Point2_Notes, EngMat_Enrolment_InYear.IYPoints2,
	EngMat_Enrolment_InYear.IYGrade3/*was Point3_Grade*/, EngMat_Enrolment_InYear.Point3_Notes, EngMat_Enrolment_InYear.IYPoints3, 
	EngMat_Enrolment_InYear.IYGrade4/*was Point4_Grade*/, EngMat_Enrolment_InYear.Point4_Notes, EngMat_Enrolment_InYear.IYPoints4,
	EngMat_Enrolment_InYear.IYGrade5/*was Point5_Grade*/, EngMat_Enrolment_InYear.Point5_Notes, EngMat_Enrolment_InYear.IYPoints5,
	EngMat_Enrolment_InYear.IYGrade6/*was Point6_Grade*/, EngMat_Enrolment_InYear.Point6_Notes, EngMat_Enrolment_InYear.IYPoints6,
	EngMat_Enrolment_InYear.IYGrade7/*was Point7_Grade*/, EngMat_Enrolment_InYear.Point7_Notes, EngMat_Enrolment_InYear.IYPoints7,
	EngMat_Enrolment_InYear.IYGrade8/*was Point8_Grade*/, EngMat_Enrolment_InYear.Point8_Notes, EngMat_Enrolment_InYear.IYPoints8,
	EngMat_Enrolment_InYear.IYGrade9/*was Point9_Grade*/, EngMat_Enrolment_InYear.Point9_Notes, EngMat_Enrolment_InYear.IYPoints9,
	EngMat_Enrolment_InYear.IYGrade10/*was Point10_Grade*/, EngMat_Enrolment_InYear.Point10_Notes, EngMat_Enrolment_InYear.IYPoints10,
	EngMat_Enrolment_InYear.IYGrade11/*was Point11_Grade*/, EngMat_Enrolment_InYear.Point11_Notes, EngMat_Enrolment_InYear.IYPoints11,
	EngMat_Enrolment_InYear.IYGrade12/*was Point12_Grade*/, EngMat_Enrolment_InYear.Point12_Notes, EngMat_Enrolment_InYear.IYPoints12,
	EngMat_Enrolment_InYear.Point1_EffortDescription, 
	EngMat_Enrolment_InYear.Point2_EffortDescription, 
	EngMat_Enrolment_InYear.Point3_EffortDescription, 
	EngMat_Enrolment_InYear.Point4_EffortDescription, 
	EngMat_Enrolment_InYear.Point5_EffortDescription, 
	EngMat_Enrolment_InYear.Point6_EffortDescription, 
	EngMat_Enrolment_InYear.Point7_EffortDescription, 
	EngMat_Enrolment_InYear.Point8_EffortDescription, 
	EngMat_Enrolment_InYear.Point9_EffortDescription, 
	EngMat_Enrolment_InYear.Point10_EffortDescription, 
	EngMat_Enrolment_InYear.Point11_EffortDescription, 
	EngMat_Enrolment_InYear.Point12_EffortDescription, 
	EngMat_Enrolment_InYear.PersonalTargetGrade,
	EngMat_Enrolment_InYear.EnrolmentGrade,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget2dp AS InYearValueAdded,
	EngMat_Enrolment_InYear.IYProgressMostRecent,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget_NationalBanding AS InYearValueAdddedvsNat, --n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent2dp AS FinalValueAdded,--n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent_NationalBanding AS FinalValueAddedvsNat,--n/a
	EngMat_Enrolment_InYear.Progress,/*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points*/
	EngMat_Enrolment_InYear.CappedProgress, /*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points, but if negative, it can only be -1*/
	--dbo.fn_WebPlusDetermineOriginOfQOEForOGPlus(EstActVA.ID) AS OriginOfQOEText, --n/a
	--dbo.fn_WebPlusGetInyearValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, IYMostRecentGrade, IYMostRecentPoints, MostRecentCollegeEstPoints2dp, IYMostRecent_vs_RecentTarget2dp) AS InyearValueAddedPopupInfo,--n/a
	--dbo.fn_WebPlusGetFinalValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, EnrolmentGrade, EnrolmentPoints, MostRecentCollegeEstPoints2dp, EnrolmentGradeVAScore_vs_MostRecent2dp) AS FinalValueAddedPopupInfo--n/a
    --
    --v1.40.1 Cumulative fields added
	EngMat_Enrolment_InYear.CumulativeStartPoints,  
	EngMat_Enrolment_InYear.CumulativeProgress,
	EngMat_Enrolment_InYear.CumulativeCappedProgress,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestGrade,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestQualType,
	EngMat_Enrolment_InYear.CumulativeStartInfo,
	EngMat_Enrolment_InYear.CumulativeMaxPotentialProgress,
	EngMat_Enrolment_InYear.CumulativeTargetGrade,
	EngMat_Enrolment_InYear.CumulativeTargetPoints,
	EngMat_Enrolment_InYear.CumulativeIYProgressMostRecent,
	EngMat_Enrolment_InYear.CumulativeIYProgress1,
	EngMat_Enrolment_InYear.CumulativeIYProgress2,
	EngMat_Enrolment_InYear.CumulativeIYProgress3,
	EngMat_Enrolment_InYear.CumulativeIYProgress4,
	EngMat_Enrolment_InYear.CumulativeIYProgress5,
	EngMat_Enrolment_InYear.CumulativeIYProgress6,
	EngMat_Enrolment_InYear.CumulativeIYProgress7,
	EngMat_Enrolment_InYear.CumulativeIYProgress8,
	EngMat_Enrolment_InYear.CumulativeIYProgress9,
	EngMat_Enrolment_InYear.CumulativeIYProgress10,
	EngMat_Enrolment_InYear.CumulativeIYProgress11,
	EngMat_Enrolment_InYear.CumulativeIYProgress12,
	CASE
		WHEN (SELECT vEngMatEnrolment.ID FROM vEngMatEnrolment WHERE EngMat_Enrolment_InYear.ID = vEngMatEnrolment.ID AND EngMat_Enrolment_InYear.AcademicYearID = vEngMatEnrolment.AcademicYearID AND EngMat_Enrolment_InYear.StudentRef = vEngMatEnrolment.StudentRef AND EngMat_Enrolment_InYear.CourseCode = vEngMatEnrolment.CourseCode) IS NULL THEN 0
		ELSE 1
	END AS IsStudentInSync,
	--
	'IMPORTED' AS RecordStatus
FROM
    EngMat_Enrolment_InYear
		INNER JOIN Course ON EngMat_Enrolment_InYear.CourseCode = Course.CourseCode AND EngMat_Enrolment_InYear.AcademicYearID = Course.AcademicYearID
			INNER JOIN OGP_Enrolment ON Course.ID = OGP_Enrolment.CourseID AND OGP_Enrolment.CourseID = OGP_Enrolment.OriginalCourseID  AND EngMat_Enrolment_InYear.StudentRef = OGP_Enrolment.StudentRef  -- added
				--INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = OGP_Enrolment.ID
				--	INNER JOIN OGP_Group ON OGP_Group.ID = OGP_GroupEnrolment.OGP_GroupID AND OGP_Group.OGP_TypeCode = @EngMatType 
				INNER JOIN OGP_Group ON (OGP_Group.OGP_GroupCode = EngMat_Enrolment_InYear.TeachingGroupCode AND 
				                         OGP_Group.OGP_TypeCode = @EngMatType AND 
										 OGP_Group.CourseID = OGP_Enrolment.CourseID AND
										 OGP_Group.AcademicYearID = @AcademicYearID)
WHERE 
	(
		(EngMat_Enrolment_InYear.CourseCode = @SearchCode)
	)
AND 
	EngMat_Enrolment_InYear.AcademicYearID = @AcademicYearID
AND 
	OGP_Enrolment.RecordStatus = 'Imported'
AND 
	EngMat_Enrolment_InYear.EngMatType = @EngMatType

UNION --UNION EngMat_Enrolment_InYear info from Enrolments in Adhoc Teaching Groups

SELECT TOP (@MaxRecords)
    EngMat_Enrolment_InYear.ID, 
	OGP_Enrolment.ID AS EnrolmentID, 
    EngMat_Enrolment_InYear.StudentRef, 
	EngMat_Enrolment_InYear.Surname, 
	EngMat_Enrolment_InYear.Forenames, 
	EngMat_Enrolment_InYear.AgeOn31Aug, 
	EngMat_Enrolment_InYear.Gender, 
	EngMat_Enrolment_InYear.Ethnicity, 
	EngMat_Enrolment_InYear.DOB,
	EngMat_Enrolment_InYear.EngMatType, /*Instead of VA_Type, We have EngMatType which is 'English' or 'Maths'*/
	EngMat_Enrolment_InYear.OutcomeDescription,
	EngMat_Enrolment_InYear.OutcomeID,
	EngMat_Enrolment_InYear.CollegeStructure,
	EngMat_Enrolment_InYear.CurrentYear,
	EngMat_Enrolment_InYear.StartDate, 
	EngMat_Enrolment_InYear.PlannedEndDate, 
	EngMat_Enrolment_InYear.ActualEndDate, 
	EngMat_Enrolment_InYear.PriorAttainment_KS4,
	EngMat_Enrolment_InYear.StartQOE_HighestGrade,
	EngMat_Enrolment_InYear.StartQOE_HighestQualType,
	EngMat_Enrolment_InYear.StartInfo,
	EngMat_Enrolment_InYear.WDNumDaysAfterStart,
	EngMat_Enrolment_InYear.CappedPoints, 
	EngMat_Enrolment_InYear.Approved,
	--EngMat_Enrolment_InYear.Size, n/a
	--EngMat_Enrolment_InYear.Duration,  n/a
	--EngMat_Enrolment_InYear.Cohort,  n/a
	EngMat_Enrolment_InYear.NotionalNVQLevel, /*NotionalNVQLevel replaces NVQLevel*/
    OGP_Group.OGP_GroupCode AS TeachingGroupCode, 
	OGP_Group.OGP_GroupTitle AS TeachingGroupTitle,
	OGP_Group.ID AS TeachingGroupID,
	Course.ID AS CourseID,
	EngMat_Enrolment_InYear.CourseCode, 
	EngMat_Enrolment_InYear.CourseTitle, 
	EngMat_Enrolment_InYear.LearningAimRef, 
	EngMat_Enrolment_InYear.LearningAimRefTitle AS LearningAimTitle,   /*LearningAimRefTitle instead of LearningAimTitle*/
	--EngMat_Enrolment_InYear.Qualification,  n/a
	--EngMat_Enrolment_InYear.QualificationCodeandName, n/a
	EngMat_Enrolment_InYear.MostRecentIYGrade, /* MostRecentIYGrade instead of IYMostRecentGrade*/
	 --EngMat_Enrolment_InYear.IYMostRecentGradeNo, --n/a
	 EngMat_Enrolment_InYear.MostRecentIYPoints, --added (The Points the IY Grade is equivalent to)
	--COALESCE (EngMat_Enrolment_InYear.QOEPoints_College2dp, EngMat_Enrolment_InYear.QOEPoints_GCSE_College2dp) AS QOEPoints,  Not Used
	EngMat_Enrolment_InYear.StartPoints, --added (Starting Points - i.e. QOE points)
	EngMat_Enrolment_InYear.StartPointsInfo, --added (Starting Point Info)
	EngMat_Enrolment_InYear.MaximumAvailablePoints, --added (The maximum number of points possible for this LearningAim)
	EngMat_Enrolment_InYear.MaxPotentialProgress, --added (The maximum Progress the student can make. i.e. MAxAvailablePoints - StartPoints)
	EngMat_Enrolment_InYear.TargetGrade, --added (The next grade up from the Starting Points)
	EngMat_Enrolment_InYear.TargetPoints, --added (The points that the Target Grade is worth)
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGrade,  --n/a.  We don't have a national target grade
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGradeInflated,  --n/a.  Wwe don't have an inflated national target grade
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEGrade,
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEPoints,
	EngMat_Enrolment_InYear.CompletionStatus, /*was CompletionDescription*/
	EngMat_Enrolment_InYear.CompletionID,
	EngMat_Enrolment_InYear.IYGrade1/*was Point1_Grade*/, EngMat_Enrolment_InYear.Point1_Notes, EngMat_Enrolment_InYear.IYPoints1,
	EngMat_Enrolment_InYear.IYGrade2/*was Point2_Grade*/, EngMat_Enrolment_InYear.Point2_Notes, EngMat_Enrolment_InYear.IYPoints2,
	EngMat_Enrolment_InYear.IYGrade3/*was Point3_Grade*/, EngMat_Enrolment_InYear.Point3_Notes, EngMat_Enrolment_InYear.IYPoints3,
	EngMat_Enrolment_InYear.IYGrade4/*was Point4_Grade*/, EngMat_Enrolment_InYear.Point4_Notes, EngMat_Enrolment_InYear.IYPoints4,
	EngMat_Enrolment_InYear.IYGrade5/*was Point5_Grade*/, EngMat_Enrolment_InYear.Point5_Notes, EngMat_Enrolment_InYear.IYPoints5,
	EngMat_Enrolment_InYear.IYGrade6/*was Point6_Grade*/, EngMat_Enrolment_InYear.Point6_Notes, EngMat_Enrolment_InYear.IYPoints6,
	EngMat_Enrolment_InYear.IYGrade7/*was Point7_Grade*/, EngMat_Enrolment_InYear.Point7_Notes, EngMat_Enrolment_InYear.IYPoints7,
	EngMat_Enrolment_InYear.IYGrade8/*was Point8_Grade*/, EngMat_Enrolment_InYear.Point8_Notes, EngMat_Enrolment_InYear.IYPoints8,
	EngMat_Enrolment_InYear.IYGrade9/*was Point9_Grade*/, EngMat_Enrolment_InYear.Point9_Notes, EngMat_Enrolment_InYear.IYPoints9,
	EngMat_Enrolment_InYear.IYGrade10/*was Point10_Grade*/, EngMat_Enrolment_InYear.Point10_Notes, EngMat_Enrolment_InYear.IYPoints10,
	EngMat_Enrolment_InYear.IYGrade11/*was Point11_Grade*/, EngMat_Enrolment_InYear.Point11_Notes, EngMat_Enrolment_InYear.IYPoints11,
	EngMat_Enrolment_InYear.IYGrade12/*was Point12_Grade*/, EngMat_Enrolment_InYear.Point12_Notes, EngMat_Enrolment_InYear.IYPoints12,
	EngMat_Enrolment_InYear.Point1_EffortDescription, 
	EngMat_Enrolment_InYear.Point2_EffortDescription, 
	EngMat_Enrolment_InYear.Point3_EffortDescription, 
	EngMat_Enrolment_InYear.Point4_EffortDescription, 
	EngMat_Enrolment_InYear.Point5_EffortDescription, 
	EngMat_Enrolment_InYear.Point6_EffortDescription, 
	EngMat_Enrolment_InYear.Point7_EffortDescription, 
	EngMat_Enrolment_InYear.Point8_EffortDescription, 
	EngMat_Enrolment_InYear.Point9_EffortDescription, 
	EngMat_Enrolment_InYear.Point10_EffortDescription, 
	EngMat_Enrolment_InYear.Point11_EffortDescription, 
	EngMat_Enrolment_InYear.Point12_EffortDescription, 
	EngMat_Enrolment_InYear.PersonalTargetGrade,
	EngMat_Enrolment_InYear.EnrolmentGrade,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget2dp AS InYearValueAdded,
	EngMat_Enrolment_InYear.IYProgressMostRecent,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget_NationalBanding AS InYearValueAdddedvsNat, --n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent2dp AS FinalValueAdded,--n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent_NationalBanding AS FinalValueAddedvsNat,--n/a
	EngMat_Enrolment_InYear.Progress, /*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points*/
	EngMat_Enrolment_InYear.CappedProgress, /*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points, but if negative, it can only be -1*/
	--dbo.fn_WebPlusDetermineOriginOfQOEForOGPlus(EstActVA.ID) AS OriginOfQOEText, --n/a
	--dbo.fn_WebPlusGetInyearValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, IYMostRecentGrade, IYMostRecentPoints, MostRecentCollegeEstPoints2dp, IYMostRecent_vs_RecentTarget2dp) AS InyearValueAddedPopupInfo,--n/a
	--dbo.fn_WebPlusGetFinalValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, EnrolmentGrade, EnrolmentPoints, MostRecentCollegeEstPoints2dp, EnrolmentGradeVAScore_vs_MostRecent2dp) AS FinalValueAddedPopupInfo--n/a
    --
    --v1.40.1 Cumulative fields added
	EngMat_Enrolment_InYear.CumulativeStartPoints,  
	EngMat_Enrolment_InYear.CumulativeProgress,
	EngMat_Enrolment_InYear.CumulativeCappedProgress,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestGrade,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestQualType,
	EngMat_Enrolment_InYear.CumulativeStartInfo,
	EngMat_Enrolment_InYear.CumulativeMaxPotentialProgress,
	EngMat_Enrolment_InYear.CumulativeTargetGrade,
	EngMat_Enrolment_InYear.CumulativeTargetPoints,
	EngMat_Enrolment_InYear.CumulativeIYProgressMostRecent,
	EngMat_Enrolment_InYear.CumulativeIYProgress1,
	EngMat_Enrolment_InYear.CumulativeIYProgress2,
	EngMat_Enrolment_InYear.CumulativeIYProgress3,
	EngMat_Enrolment_InYear.CumulativeIYProgress4,
	EngMat_Enrolment_InYear.CumulativeIYProgress5,
	EngMat_Enrolment_InYear.CumulativeIYProgress6,
	EngMat_Enrolment_InYear.CumulativeIYProgress7,
	EngMat_Enrolment_InYear.CumulativeIYProgress8,
	EngMat_Enrolment_InYear.CumulativeIYProgress9,
	EngMat_Enrolment_InYear.CumulativeIYProgress10,
	EngMat_Enrolment_InYear.CumulativeIYProgress11,
	EngMat_Enrolment_InYear.CumulativeIYProgress12,
	CASE
		WHEN (SELECT vEngMatEnrolment.ID FROM vEngMatEnrolment WHERE EngMat_Enrolment_InYear.ID = vEngMatEnrolment.ID AND EngMat_Enrolment_InYear.AcademicYearID = vEngMatEnrolment.AcademicYearID AND EngMat_Enrolment_InYear.StudentRef = vEngMatEnrolment.StudentRef AND EngMat_Enrolment_InYear.CourseCode = vEngMatEnrolment.CourseCode) IS NULL THEN 0
		ELSE 1
	END AS IsStudentInSync,
	--
	'ADHOC' AS RecordStatus
FROM
	EngMat_Enrolment_InYear
		INNER JOIN Course ON EngMat_Enrolment_InYear.CourseCode = Course.CourseCode AND EngMat_Enrolment_InYear.AcademicYearID = Course.AcademicYearID
			INNER JOIN OGP_Enrolment ON Course.ID = OGP_Enrolment.OriginalCourseID AND EngMat_Enrolment_InYear.StudentRef = OGP_Enrolment.StudentRef  --Link to OriginalCourseID because we want the Original VA (values, LAim, Course)
				INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = OGP_Enrolment.ID
					INNER JOIN OGP_Group ON OGP_Group.ID = OGP_GroupEnrolment.OGP_GroupID AND OGP_Group.OGP_TypeCode = @EngMatType 
WHERE
	(
		(EngMat_Enrolment_InYear.CourseCode = @SearchCode)
	)
    AND EngMat_Enrolment_InYear.AcademicYearID = @AcademicYearID
      --For now, all records in these 3 tables will be adhoc and created by manual data entry through OneGrade Plus
	AND OGP_Group.RecordStatus = 'Adhoc'
	AND OGP_GroupEnrolment.RecordStatus = 'Adhoc'
--	AND OGP_Enrolment.RecordStatus = 'Adhoc'
	AND EngMat_Enrolment_InYear.EngMatType = @EngMatType
) union_query
ORDER BY 
	4,5,3   -- Surname,Forename,StudentRef


END


--****************************************************************************************
--                              L E A R N I N G   A I M
--****************************************************************************************
IF @SearchType IN ('LEARNINGAIM', 'LEARN')
BEGIN

SELECT TOP (@MaxRecords) * FROM
(
SELECT TOP (@MaxRecords)
    EngMat_Enrolment_InYear.ID, 
	OGP_Enrolment.ID AS EnrolmentID, 
    EngMat_Enrolment_InYear.StudentRef, 
	EngMat_Enrolment_InYear.Surname, 
	EngMat_Enrolment_InYear.Forenames, 
	EngMat_Enrolment_InYear.AgeOn31Aug, 
	EngMat_Enrolment_InYear.Gender, 
	EngMat_Enrolment_InYear.Ethnicity, 
	EngMat_Enrolment_InYear.DOB,
	EngMat_Enrolment_InYear.EngMatType, /*Instead of VA_Type, We have EngMatType which is 'English' or 'Maths'*/
	EngMat_Enrolment_InYear.OutcomeDescription,
	EngMat_Enrolment_InYear.OutcomeID,
	EngMat_Enrolment_InYear.CollegeStructure,
	EngMat_Enrolment_InYear.CurrentYear,
	EngMat_Enrolment_InYear.StartDate, 
	EngMat_Enrolment_InYear.PlannedEndDate, 
	EngMat_Enrolment_InYear.ActualEndDate, 
	EngMat_Enrolment_InYear.PriorAttainment_KS4,
	EngMat_Enrolment_InYear.StartQOE_HighestGrade,
	EngMat_Enrolment_InYear.StartQOE_HighestQualType,
	EngMat_Enrolment_InYear.StartInfo,
	EngMat_Enrolment_InYear.WDNumDaysAfterStart,
	EngMat_Enrolment_InYear.CappedPoints, 
	EngMat_Enrolment_InYear.Approved,
	--EngMat_Enrolment_InYear.Size, n/a
	--EngMat_Enrolment_InYear.Duration,  n/a
	--EngMat_Enrolment_InYear.Cohort,  n/a
	EngMat_Enrolment_InYear.NotionalNVQLevel, /*NotionalNVQLevel replaces NVQLevel*/
    EngMat_Enrolment_InYear.TeachingGroupCode, 
	EngMat_Enrolment_InYear.TeachingGroupTitle,
	OGP_Group.ID AS TeachingGroupID,
	Course.ID AS CourseID,
	EngMat_Enrolment_InYear.CourseCode, 
	EngMat_Enrolment_InYear.CourseTitle, 
	EngMat_Enrolment_InYear.LearningAimRef, 
	EngMat_Enrolment_InYear.LearningAimRefTitle AS LearningAimTitle,  /*LearningAimRefTitle instead of LearningAimTitle*/
	--EngMat_Enrolment_InYear.Qualification,  n/a
	--EngMat_Enrolment_InYear.QualificationCodeandName, n/a
	EngMat_Enrolment_InYear.MostRecentIYGrade, /* MostRecentIYGrade instead of IYMostRecentGrade*/
	 --EngMat_Enrolment_InYear.IYMostRecentGradeNo, --n/a
	 EngMat_Enrolment_InYear.MostRecentIYPoints, --added (The Points the IY Grade is equivalent to)
	--COALESCE (EngMat_Enrolment_InYear.QOEPoints_College2dp, EngMat_Enrolment_InYear.QOEPoints_GCSE_College2dp) AS QOEPoints,  Not Used
	EngMat_Enrolment_InYear.StartPoints, --added (Starting Points - i.e. QOE points)
	EngMat_Enrolment_InYear.StartPointsInfo, --added (Starting Point Info)
	EngMat_Enrolment_InYear.MaximumAvailablePoints, --added (The maximum number of points possible for this LearningAim)
	EngMat_Enrolment_InYear.MaxPotentialProgress, --added (The maximum Progress the student can make. i.e. MAxAvailablePoints - StartPoints)
	EngMat_Enrolment_InYear.TargetGrade, --added (The next grade up from the Starting Points)
	EngMat_Enrolment_InYear.TargetPoints, --added (The points that the Target Grade is worth)
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGrade,  --n/a.  We don't have a national target grade
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGradeInflated,  --n/a.  Wwe don't have an inflated national target grade
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEGrade,
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEPoints,
	EngMat_Enrolment_InYear.CompletionStatus AS CompletionDescription, /*was CompletionDescription*/
	EngMat_Enrolment_InYear.CompletionID,
	EngMat_Enrolment_InYear.IYGrade1/*was Point1_Grade*/, EngMat_Enrolment_InYear.Point1_Notes, EngMat_Enrolment_InYear.IYPoints1,
	EngMat_Enrolment_InYear.IYGrade2/*was Point2_Grade*/, EngMat_Enrolment_InYear.Point2_Notes, EngMat_Enrolment_InYear.IYPoints2,
	EngMat_Enrolment_InYear.IYGrade3/*was Point3_Grade*/, EngMat_Enrolment_InYear.Point3_Notes, EngMat_Enrolment_InYear.IYPoints3, 
	EngMat_Enrolment_InYear.IYGrade4/*was Point4_Grade*/, EngMat_Enrolment_InYear.Point4_Notes, EngMat_Enrolment_InYear.IYPoints4,
	EngMat_Enrolment_InYear.IYGrade5/*was Point5_Grade*/, EngMat_Enrolment_InYear.Point5_Notes, EngMat_Enrolment_InYear.IYPoints5,
	EngMat_Enrolment_InYear.IYGrade6/*was Point6_Grade*/, EngMat_Enrolment_InYear.Point6_Notes, EngMat_Enrolment_InYear.IYPoints6,
	EngMat_Enrolment_InYear.IYGrade7/*was Point7_Grade*/, EngMat_Enrolment_InYear.Point7_Notes, EngMat_Enrolment_InYear.IYPoints7,
	EngMat_Enrolment_InYear.IYGrade8/*was Point8_Grade*/, EngMat_Enrolment_InYear.Point8_Notes, EngMat_Enrolment_InYear.IYPoints8,
	EngMat_Enrolment_InYear.IYGrade9/*was Point9_Grade*/, EngMat_Enrolment_InYear.Point9_Notes, EngMat_Enrolment_InYear.IYPoints9,
	EngMat_Enrolment_InYear.IYGrade10/*was Point10_Grade*/, EngMat_Enrolment_InYear.Point10_Notes, EngMat_Enrolment_InYear.IYPoints10,
	EngMat_Enrolment_InYear.IYGrade11/*was Point11_Grade*/, EngMat_Enrolment_InYear.Point11_Notes, EngMat_Enrolment_InYear.IYPoints11,
	EngMat_Enrolment_InYear.IYGrade12/*was Point12_Grade*/, EngMat_Enrolment_InYear.Point12_Notes, EngMat_Enrolment_InYear.IYPoints12,
	EngMat_Enrolment_InYear.Point1_EffortDescription, 
	EngMat_Enrolment_InYear.Point2_EffortDescription, 
	EngMat_Enrolment_InYear.Point3_EffortDescription, 
	EngMat_Enrolment_InYear.Point4_EffortDescription, 
	EngMat_Enrolment_InYear.Point5_EffortDescription, 
	EngMat_Enrolment_InYear.Point6_EffortDescription, 
	EngMat_Enrolment_InYear.Point7_EffortDescription, 
	EngMat_Enrolment_InYear.Point8_EffortDescription, 
	EngMat_Enrolment_InYear.Point9_EffortDescription, 
	EngMat_Enrolment_InYear.Point10_EffortDescription, 
	EngMat_Enrolment_InYear.Point11_EffortDescription, 
	EngMat_Enrolment_InYear.Point12_EffortDescription, 
	EngMat_Enrolment_InYear.PersonalTargetGrade,
	EngMat_Enrolment_InYear.EnrolmentGrade,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget2dp AS InYearValueAdded,
	EngMat_Enrolment_InYear.IYProgressMostRecent,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget_NationalBanding AS InYearValueAdddedvsNat, --n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent2dp AS FinalValueAdded,--n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent_NationalBanding AS FinalValueAddedvsNat,--n/a
	EngMat_Enrolment_InYear.Progress,/*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points*/
	EngMat_Enrolment_InYear.CappedProgress, /*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points, but if negative, it can only be -1*/
	--dbo.fn_WebPlusDetermineOriginOfQOEForOGPlus(EstActVA.ID) AS OriginOfQOEText, --n/a
	--dbo.fn_WebPlusGetInyearValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, IYMostRecentGrade, IYMostRecentPoints, MostRecentCollegeEstPoints2dp, IYMostRecent_vs_RecentTarget2dp) AS InyearValueAddedPopupInfo,--n/a
	--dbo.fn_WebPlusGetFinalValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, EnrolmentGrade, EnrolmentPoints, MostRecentCollegeEstPoints2dp, EnrolmentGradeVAScore_vs_MostRecent2dp) AS FinalValueAddedPopupInfo--n/a
    --
    --v1.40.1 Cumulative fields added
	EngMat_Enrolment_InYear.CumulativeStartPoints,  
	EngMat_Enrolment_InYear.CumulativeProgress,
	EngMat_Enrolment_InYear.CumulativeCappedProgress,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestGrade,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestQualType,
	EngMat_Enrolment_InYear.CumulativeStartInfo,
	EngMat_Enrolment_InYear.CumulativeMaxPotentialProgress,
	EngMat_Enrolment_InYear.CumulativeTargetGrade,
	EngMat_Enrolment_InYear.CumulativeTargetPoints,
	EngMat_Enrolment_InYear.CumulativeIYProgressMostRecent,
	EngMat_Enrolment_InYear.CumulativeIYProgress1,
	EngMat_Enrolment_InYear.CumulativeIYProgress2,
	EngMat_Enrolment_InYear.CumulativeIYProgress3,
	EngMat_Enrolment_InYear.CumulativeIYProgress4,
	EngMat_Enrolment_InYear.CumulativeIYProgress5,
	EngMat_Enrolment_InYear.CumulativeIYProgress6,
	EngMat_Enrolment_InYear.CumulativeIYProgress7,
	EngMat_Enrolment_InYear.CumulativeIYProgress8,
	EngMat_Enrolment_InYear.CumulativeIYProgress9,
	EngMat_Enrolment_InYear.CumulativeIYProgress10,
	EngMat_Enrolment_InYear.CumulativeIYProgress11,
	EngMat_Enrolment_InYear.CumulativeIYProgress12,
	CASE
		WHEN (SELECT vEngMatEnrolment.ID FROM vEngMatEnrolment WHERE EngMat_Enrolment_InYear.ID = vEngMatEnrolment.ID AND EngMat_Enrolment_InYear.AcademicYearID = vEngMatEnrolment.AcademicYearID AND EngMat_Enrolment_InYear.StudentRef = vEngMatEnrolment.StudentRef AND EngMat_Enrolment_InYear.CourseCode = vEngMatEnrolment.CourseCode) IS NULL THEN 0
		ELSE 1
	END AS IsStudentInSync,
	--
	'IMPORTED' AS RecordStatus
FROM
    EngMat_Enrolment_InYear
		INNER JOIN Course ON EngMat_Enrolment_InYear.CourseCode = Course.CourseCode AND EngMat_Enrolment_InYear.AcademicYearID = Course.AcademicYearID
			INNER JOIN OGP_Enrolment ON Course.ID = OGP_Enrolment.CourseID AND OGP_Enrolment.CourseID = OGP_Enrolment.OriginalCourseID  AND EngMat_Enrolment_InYear.StudentRef = OGP_Enrolment.StudentRef  -- added
				--INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = OGP_Enrolment.ID
				--	INNER JOIN OGP_Group ON OGP_Group.ID = OGP_GroupEnrolment.OGP_GroupID AND OGP_Group.OGP_TypeCode = @EngMatType 
				INNER JOIN OGP_Group ON (OGP_Group.OGP_GroupCode = EngMat_Enrolment_InYear.TeachingGroupCode AND 
				                         OGP_Group.OGP_TypeCode = @EngMatType AND 
										 OGP_Group.CourseID = OGP_Enrolment.CourseID AND
										 OGP_Group.AcademicYearID = @AcademicYearID)
WHERE 
	(
		(EngMat_Enrolment_InYear.LearningAimRef = @SearchCode)
	)
AND 
	EngMat_Enrolment_InYear.AcademicYearID = @AcademicYearID
AND 
	OGP_Enrolment.RecordStatus = 'Imported'
AND 
	EngMat_Enrolment_InYear.EngMatType = @EngMatType

UNION --UNION EngMat_Enrolment_InYear info from Enrolments in Adhoc Teaching Groups

SELECT TOP (@MaxRecords)
    EngMat_Enrolment_InYear.ID, 
	OGP_Enrolment.ID AS EnrolmentID, 
    EngMat_Enrolment_InYear.StudentRef, 
	EngMat_Enrolment_InYear.Surname, 
	EngMat_Enrolment_InYear.Forenames, 
	EngMat_Enrolment_InYear.AgeOn31Aug, 
	EngMat_Enrolment_InYear.Gender, 
	EngMat_Enrolment_InYear.Ethnicity, 
	EngMat_Enrolment_InYear.DOB,
	EngMat_Enrolment_InYear.EngMatType, /*Instead of VA_Type, We have EngMatType which is 'English' or 'Maths'*/
	EngMat_Enrolment_InYear.OutcomeDescription,
	EngMat_Enrolment_InYear.OutcomeID,
	EngMat_Enrolment_InYear.CollegeStructure,
	EngMat_Enrolment_InYear.CurrentYear,
	EngMat_Enrolment_InYear.StartDate, 
	EngMat_Enrolment_InYear.PlannedEndDate, 
	EngMat_Enrolment_InYear.ActualEndDate, 
	EngMat_Enrolment_InYear.PriorAttainment_KS4,
	EngMat_Enrolment_InYear.StartQOE_HighestGrade,
	EngMat_Enrolment_InYear.StartQOE_HighestQualType,
	EngMat_Enrolment_InYear.StartInfo,
	EngMat_Enrolment_InYear.WDNumDaysAfterStart,
	EngMat_Enrolment_InYear.CappedPoints, 
	EngMat_Enrolment_InYear.Approved,
	--EngMat_Enrolment_InYear.Size, n/a
	--EngMat_Enrolment_InYear.Duration,  n/a
	--EngMat_Enrolment_InYear.Cohort,  n/a
	EngMat_Enrolment_InYear.NotionalNVQLevel, /*NotionalNVQLevel replaces NVQLevel*/
    OGP_Group.OGP_GroupCode AS TeachingGroupCode, 
	OGP_Group.OGP_GroupTitle AS TeachingGroupTitle,
	OGP_Group.ID AS TeachingGroupID,
	Course.ID AS CourseID,
	EngMat_Enrolment_InYear.CourseCode, 
	EngMat_Enrolment_InYear.CourseTitle, 
	EngMat_Enrolment_InYear.LearningAimRef, 
	EngMat_Enrolment_InYear.LearningAimRefTitle AS LearningAimTitle,   /*LearningAimRefTitle instead of LearningAimTitle*/
	--EngMat_Enrolment_InYear.Qualification,  n/a
	--EngMat_Enrolment_InYear.QualificationCodeandName, n/a
	EngMat_Enrolment_InYear.MostRecentIYGrade, /* MostRecentIYGrade instead of IYMostRecentGrade*/
	 --EngMat_Enrolment_InYear.IYMostRecentGradeNo, --n/a
	 EngMat_Enrolment_InYear.MostRecentIYPoints, --added (The Points the IY Grade is equivalent to)
	--COALESCE (EngMat_Enrolment_InYear.QOEPoints_College2dp, EngMat_Enrolment_InYear.QOEPoints_GCSE_College2dp) AS QOEPoints,  Not Used
	EngMat_Enrolment_InYear.StartPoints, --added (Starting Points - i.e. QOE points)
	EngMat_Enrolment_InYear.StartPointsInfo, --added (Starting Point Info)
	EngMat_Enrolment_InYear.MaximumAvailablePoints, --added (The maximum number of points possible for this LearningAim)
	EngMat_Enrolment_InYear.MaxPotentialProgress, --added (The maximum Progress the student can make. i.e. MAxAvailablePoints - StartPoints)
	EngMat_Enrolment_InYear.TargetGrade, --added (The next grade up from the Starting Points)
	EngMat_Enrolment_InYear.TargetPoints, --added (The points that the Target Grade is worth)
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGrade,  --n/a.  We don't have a national target grade
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGradeInflated,  --n/a.  Wwe don't have an inflated national target grade
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEGrade,
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEPoints,
	EngMat_Enrolment_InYear.CompletionStatus, /*was CompletionDescription*/
	EngMat_Enrolment_InYear.CompletionID,
	EngMat_Enrolment_InYear.IYGrade1/*was Point1_Grade*/, EngMat_Enrolment_InYear.Point1_Notes, EngMat_Enrolment_InYear.IYPoints1,
	EngMat_Enrolment_InYear.IYGrade2/*was Point2_Grade*/, EngMat_Enrolment_InYear.Point2_Notes, EngMat_Enrolment_InYear.IYPoints2,
	EngMat_Enrolment_InYear.IYGrade3/*was Point3_Grade*/, EngMat_Enrolment_InYear.Point3_Notes, EngMat_Enrolment_InYear.IYPoints3,
	EngMat_Enrolment_InYear.IYGrade4/*was Point4_Grade*/, EngMat_Enrolment_InYear.Point4_Notes, EngMat_Enrolment_InYear.IYPoints4,
	EngMat_Enrolment_InYear.IYGrade5/*was Point5_Grade*/, EngMat_Enrolment_InYear.Point5_Notes, EngMat_Enrolment_InYear.IYPoints5,
	EngMat_Enrolment_InYear.IYGrade6/*was Point6_Grade*/, EngMat_Enrolment_InYear.Point6_Notes, EngMat_Enrolment_InYear.IYPoints6,
	EngMat_Enrolment_InYear.IYGrade7/*was Point7_Grade*/, EngMat_Enrolment_InYear.Point7_Notes, EngMat_Enrolment_InYear.IYPoints7,
	EngMat_Enrolment_InYear.IYGrade8/*was Point8_Grade*/, EngMat_Enrolment_InYear.Point8_Notes, EngMat_Enrolment_InYear.IYPoints8,
	EngMat_Enrolment_InYear.IYGrade9/*was Point9_Grade*/, EngMat_Enrolment_InYear.Point9_Notes, EngMat_Enrolment_InYear.IYPoints9,
	EngMat_Enrolment_InYear.IYGrade10/*was Point10_Grade*/, EngMat_Enrolment_InYear.Point10_Notes, EngMat_Enrolment_InYear.IYPoints10,
	EngMat_Enrolment_InYear.IYGrade11/*was Point11_Grade*/, EngMat_Enrolment_InYear.Point11_Notes, EngMat_Enrolment_InYear.IYPoints11,
	EngMat_Enrolment_InYear.IYGrade12/*was Point12_Grade*/, EngMat_Enrolment_InYear.Point12_Notes, EngMat_Enrolment_InYear.IYPoints12,
	EngMat_Enrolment_InYear.Point1_EffortDescription, 
	EngMat_Enrolment_InYear.Point2_EffortDescription, 
	EngMat_Enrolment_InYear.Point3_EffortDescription, 
	EngMat_Enrolment_InYear.Point4_EffortDescription, 
	EngMat_Enrolment_InYear.Point5_EffortDescription, 
	EngMat_Enrolment_InYear.Point6_EffortDescription, 
	EngMat_Enrolment_InYear.Point7_EffortDescription, 
	EngMat_Enrolment_InYear.Point8_EffortDescription, 
	EngMat_Enrolment_InYear.Point9_EffortDescription, 
	EngMat_Enrolment_InYear.Point10_EffortDescription, 
	EngMat_Enrolment_InYear.Point11_EffortDescription, 
	EngMat_Enrolment_InYear.Point12_EffortDescription, 
	EngMat_Enrolment_InYear.PersonalTargetGrade,
	EngMat_Enrolment_InYear.EnrolmentGrade,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget2dp AS InYearValueAdded,
	EngMat_Enrolment_InYear.IYProgressMostRecent,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget_NationalBanding AS InYearValueAdddedvsNat, --n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent2dp AS FinalValueAdded,--n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent_NationalBanding AS FinalValueAddedvsNat,--n/a
	EngMat_Enrolment_InYear.Progress, /*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points*/
	EngMat_Enrolment_InYear.CappedProgress, /*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points, but if negative, it can only be -1*/
	--dbo.fn_WebPlusDetermineOriginOfQOEForOGPlus(EstActVA.ID) AS OriginOfQOEText, --n/a
	--dbo.fn_WebPlusGetInyearValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, IYMostRecentGrade, IYMostRecentPoints, MostRecentCollegeEstPoints2dp, IYMostRecent_vs_RecentTarget2dp) AS InyearValueAddedPopupInfo,--n/a
	--dbo.fn_WebPlusGetFinalValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, EnrolmentGrade, EnrolmentPoints, MostRecentCollegeEstPoints2dp, EnrolmentGradeVAScore_vs_MostRecent2dp) AS FinalValueAddedPopupInfo--n/a
    --
    --v1.40.1 Cumulative fields added
	EngMat_Enrolment_InYear.CumulativeStartPoints,  
	EngMat_Enrolment_InYear.CumulativeProgress,
	EngMat_Enrolment_InYear.CumulativeCappedProgress,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestGrade,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestQualType,
	EngMat_Enrolment_InYear.CumulativeStartInfo,
	EngMat_Enrolment_InYear.CumulativeMaxPotentialProgress,
	EngMat_Enrolment_InYear.CumulativeTargetGrade,
	EngMat_Enrolment_InYear.CumulativeTargetPoints,
	EngMat_Enrolment_InYear.CumulativeIYProgressMostRecent,
	EngMat_Enrolment_InYear.CumulativeIYProgress1,
	EngMat_Enrolment_InYear.CumulativeIYProgress2,
	EngMat_Enrolment_InYear.CumulativeIYProgress3,
	EngMat_Enrolment_InYear.CumulativeIYProgress4,
	EngMat_Enrolment_InYear.CumulativeIYProgress5,
	EngMat_Enrolment_InYear.CumulativeIYProgress6,
	EngMat_Enrolment_InYear.CumulativeIYProgress7,
	EngMat_Enrolment_InYear.CumulativeIYProgress8,
	EngMat_Enrolment_InYear.CumulativeIYProgress9,
	EngMat_Enrolment_InYear.CumulativeIYProgress10,
	EngMat_Enrolment_InYear.CumulativeIYProgress11,
	EngMat_Enrolment_InYear.CumulativeIYProgress12,
	CASE
		WHEN (SELECT vEngMatEnrolment.ID FROM vEngMatEnrolment WHERE EngMat_Enrolment_InYear.ID = vEngMatEnrolment.ID AND EngMat_Enrolment_InYear.AcademicYearID = vEngMatEnrolment.AcademicYearID AND EngMat_Enrolment_InYear.StudentRef = vEngMatEnrolment.StudentRef AND EngMat_Enrolment_InYear.CourseCode = vEngMatEnrolment.CourseCode) IS NULL THEN 0
		ELSE 1
	END AS IsStudentInSync,
	--
	'ADHOC' AS RecordStatus
FROM
	EngMat_Enrolment_InYear
		INNER JOIN Course ON EngMat_Enrolment_InYear.CourseCode = Course.CourseCode AND EngMat_Enrolment_InYear.AcademicYearID = Course.AcademicYearID
			INNER JOIN OGP_Enrolment ON Course.ID = OGP_Enrolment.OriginalCourseID AND EngMat_Enrolment_InYear.StudentRef = OGP_Enrolment.StudentRef  --Link to OriginalCourseID because we want the Original VA (values, LAim, Course)
				INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = OGP_Enrolment.ID
					INNER JOIN OGP_Group ON OGP_Group.ID = OGP_GroupEnrolment.OGP_GroupID AND OGP_Group.OGP_TypeCode = @EngMatType 
WHERE
	(
		(EngMat_Enrolment_InYear.LearningAimRef = @SearchCode)
	)
    AND EngMat_Enrolment_InYear.AcademicYearID = @AcademicYearID
      --For now, all records in these 3 tables will be adhoc and created by manual data entry through OneGrade Plus
	AND OGP_Group.RecordStatus = 'Adhoc'
	AND OGP_GroupEnrolment.RecordStatus = 'Adhoc'
--	AND OGP_Enrolment.RecordStatus = 'Adhoc'
	AND EngMat_Enrolment_InYear.EngMatType = @EngMatType
) union_query
ORDER BY 
	4,5,3   -- Surname,Forename,StudentRef

END


--****************************************************************************************
--                              D E P A R T M E N T
--****************************************************************************************
IF @SearchType IN ('DEPARTMENT', 'DEPT') 
BEGIN

SELECT TOP (@MaxRecords) * FROM
(
SELECT TOP (@MaxRecords)
    EngMat_Enrolment_InYear.ID, 
	OGP_Enrolment.ID AS EnrolmentID, 
    EngMat_Enrolment_InYear.StudentRef, 
	EngMat_Enrolment_InYear.Surname, 
	EngMat_Enrolment_InYear.Forenames, 
	EngMat_Enrolment_InYear.AgeOn31Aug, 
	EngMat_Enrolment_InYear.Gender, 
	EngMat_Enrolment_InYear.Ethnicity, 
	EngMat_Enrolment_InYear.DOB,
	EngMat_Enrolment_InYear.EngMatType, /*Instead of VA_Type, We have EngMatType which is 'English' or 'Maths'*/
	EngMat_Enrolment_InYear.OutcomeDescription,
	EngMat_Enrolment_InYear.OutcomeID,
	EngMat_Enrolment_InYear.CollegeStructure,
	EngMat_Enrolment_InYear.CurrentYear,
	EngMat_Enrolment_InYear.StartDate, 
	EngMat_Enrolment_InYear.PlannedEndDate, 
	EngMat_Enrolment_InYear.ActualEndDate, 
	EngMat_Enrolment_InYear.PriorAttainment_KS4,
	EngMat_Enrolment_InYear.StartQOE_HighestGrade,
	EngMat_Enrolment_InYear.StartQOE_HighestQualType,
	EngMat_Enrolment_InYear.StartInfo,
	EngMat_Enrolment_InYear.WDNumDaysAfterStart,
	EngMat_Enrolment_InYear.CappedPoints, 
	EngMat_Enrolment_InYear.Approved,
	--EngMat_Enrolment_InYear.Size, n/a
	--EngMat_Enrolment_InYear.Duration,  n/a
	--EngMat_Enrolment_InYear.Cohort,  n/a
	EngMat_Enrolment_InYear.NotionalNVQLevel, /*NotionalNVQLevel replaces NVQLevel*/
    EngMat_Enrolment_InYear.TeachingGroupCode, 
	EngMat_Enrolment_InYear.TeachingGroupTitle,
	OGP_Group.ID AS TeachingGroupID,
	Course.ID AS CourseID,
	EngMat_Enrolment_InYear.CourseCode, 
	EngMat_Enrolment_InYear.CourseTitle, 
	EngMat_Enrolment_InYear.LearningAimRef, 
	EngMat_Enrolment_InYear.LearningAimRefTitle AS LearningAimTitle,  /*LearningAimRefTitle instead of LearningAimTitle*/
	--EngMat_Enrolment_InYear.Qualification,  n/a
	--EngMat_Enrolment_InYear.QualificationCodeandName, n/a
	EngMat_Enrolment_InYear.MostRecentIYGrade, /* MostRecentIYGrade instead of IYMostRecentGrade*/
	 --EngMat_Enrolment_InYear.IYMostRecentGradeNo, --n/a
	 EngMat_Enrolment_InYear.MostRecentIYPoints, --added (The Points the IY Grade is equivalent to)
	--COALESCE (EngMat_Enrolment_InYear.QOEPoints_College2dp, EngMat_Enrolment_InYear.QOEPoints_GCSE_College2dp) AS QOEPoints,  Not Used
	EngMat_Enrolment_InYear.StartPoints, --added (Starting Points - i.e. QOE points)
	EngMat_Enrolment_InYear.StartPointsInfo, --added (Starting Point Info)
	EngMat_Enrolment_InYear.MaximumAvailablePoints, --added (The maximum number of points possible for this LearningAim)
	EngMat_Enrolment_InYear.MaxPotentialProgress, --added (The maximum Progress the student can make. i.e. MAxAvailablePoints - StartPoints)
	EngMat_Enrolment_InYear.TargetGrade, --added (The next grade up from the Starting Points)
	EngMat_Enrolment_InYear.TargetPoints, --added (The points that the Target Grade is worth)
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGrade,  --n/a.  We don't have a national target grade
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGradeInflated,  --n/a.  Wwe don't have an inflated national target grade
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEGrade,
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEPoints,
	EngMat_Enrolment_InYear.CompletionStatus AS CompletionDescription, /*was CompletionDescription*/
	EngMat_Enrolment_InYear.CompletionID,
	EngMat_Enrolment_InYear.IYGrade1/*was Point1_Grade*/, EngMat_Enrolment_InYear.Point1_Notes, EngMat_Enrolment_InYear.IYPoints1,
	EngMat_Enrolment_InYear.IYGrade2/*was Point2_Grade*/, EngMat_Enrolment_InYear.Point2_Notes, EngMat_Enrolment_InYear.IYPoints2,
	EngMat_Enrolment_InYear.IYGrade3/*was Point3_Grade*/, EngMat_Enrolment_InYear.Point3_Notes, EngMat_Enrolment_InYear.IYPoints3, 
	EngMat_Enrolment_InYear.IYGrade4/*was Point4_Grade*/, EngMat_Enrolment_InYear.Point4_Notes, EngMat_Enrolment_InYear.IYPoints4,
	EngMat_Enrolment_InYear.IYGrade5/*was Point5_Grade*/, EngMat_Enrolment_InYear.Point5_Notes, EngMat_Enrolment_InYear.IYPoints5,
	EngMat_Enrolment_InYear.IYGrade6/*was Point6_Grade*/, EngMat_Enrolment_InYear.Point6_Notes, EngMat_Enrolment_InYear.IYPoints6,
	EngMat_Enrolment_InYear.IYGrade7/*was Point7_Grade*/, EngMat_Enrolment_InYear.Point7_Notes, EngMat_Enrolment_InYear.IYPoints7,
	EngMat_Enrolment_InYear.IYGrade8/*was Point8_Grade*/, EngMat_Enrolment_InYear.Point8_Notes, EngMat_Enrolment_InYear.IYPoints8,
	EngMat_Enrolment_InYear.IYGrade9/*was Point9_Grade*/, EngMat_Enrolment_InYear.Point9_Notes, EngMat_Enrolment_InYear.IYPoints9,
	EngMat_Enrolment_InYear.IYGrade10/*was Point10_Grade*/, EngMat_Enrolment_InYear.Point10_Notes, EngMat_Enrolment_InYear.IYPoints10,
	EngMat_Enrolment_InYear.IYGrade11/*was Point11_Grade*/, EngMat_Enrolment_InYear.Point11_Notes, EngMat_Enrolment_InYear.IYPoints11,
	EngMat_Enrolment_InYear.IYGrade12/*was Point12_Grade*/, EngMat_Enrolment_InYear.Point12_Notes, EngMat_Enrolment_InYear.IYPoints12,
	EngMat_Enrolment_InYear.Point1_EffortDescription, 
	EngMat_Enrolment_InYear.Point2_EffortDescription, 
	EngMat_Enrolment_InYear.Point3_EffortDescription, 
	EngMat_Enrolment_InYear.Point4_EffortDescription, 
	EngMat_Enrolment_InYear.Point5_EffortDescription, 
	EngMat_Enrolment_InYear.Point6_EffortDescription, 
	EngMat_Enrolment_InYear.Point7_EffortDescription, 
	EngMat_Enrolment_InYear.Point8_EffortDescription, 
	EngMat_Enrolment_InYear.Point9_EffortDescription, 
	EngMat_Enrolment_InYear.Point10_EffortDescription, 
	EngMat_Enrolment_InYear.Point11_EffortDescription, 
	EngMat_Enrolment_InYear.Point12_EffortDescription, 
	EngMat_Enrolment_InYear.PersonalTargetGrade,
	EngMat_Enrolment_InYear.EnrolmentGrade,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget2dp AS InYearValueAdded,
	EngMat_Enrolment_InYear.IYProgressMostRecent,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget_NationalBanding AS InYearValueAdddedvsNat, --n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent2dp AS FinalValueAdded,--n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent_NationalBanding AS FinalValueAddedvsNat,--n/a
	EngMat_Enrolment_InYear.Progress,/*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points*/
	EngMat_Enrolment_InYear.CappedProgress, /*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points, but if negative, it can only be -1*/
	--dbo.fn_WebPlusDetermineOriginOfQOEForOGPlus(EstActVA.ID) AS OriginOfQOEText, --n/a
	--dbo.fn_WebPlusGetInyearValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, IYMostRecentGrade, IYMostRecentPoints, MostRecentCollegeEstPoints2dp, IYMostRecent_vs_RecentTarget2dp) AS InyearValueAddedPopupInfo,--n/a
	--dbo.fn_WebPlusGetFinalValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, EnrolmentGrade, EnrolmentPoints, MostRecentCollegeEstPoints2dp, EnrolmentGradeVAScore_vs_MostRecent2dp) AS FinalValueAddedPopupInfo--n/a
    --
    --v1.40.1 Cumulative fields added
	EngMat_Enrolment_InYear.CumulativeStartPoints,  
	EngMat_Enrolment_InYear.CumulativeProgress,
	EngMat_Enrolment_InYear.CumulativeCappedProgress,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestGrade,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestQualType,
	EngMat_Enrolment_InYear.CumulativeStartInfo,
	EngMat_Enrolment_InYear.CumulativeMaxPotentialProgress,
	EngMat_Enrolment_InYear.CumulativeTargetGrade,
	EngMat_Enrolment_InYear.CumulativeTargetPoints,
	EngMat_Enrolment_InYear.CumulativeIYProgressMostRecent,
	EngMat_Enrolment_InYear.CumulativeIYProgress1,
	EngMat_Enrolment_InYear.CumulativeIYProgress2,
	EngMat_Enrolment_InYear.CumulativeIYProgress3,
	EngMat_Enrolment_InYear.CumulativeIYProgress4,
	EngMat_Enrolment_InYear.CumulativeIYProgress5,
	EngMat_Enrolment_InYear.CumulativeIYProgress6,
	EngMat_Enrolment_InYear.CumulativeIYProgress7,
	EngMat_Enrolment_InYear.CumulativeIYProgress8,
	EngMat_Enrolment_InYear.CumulativeIYProgress9,
	EngMat_Enrolment_InYear.CumulativeIYProgress10,
	EngMat_Enrolment_InYear.CumulativeIYProgress11,
	EngMat_Enrolment_InYear.CumulativeIYProgress12,
	CASE
		WHEN (SELECT vEngMatEnrolment.ID FROM vEngMatEnrolment WHERE EngMat_Enrolment_InYear.ID = vEngMatEnrolment.ID AND EngMat_Enrolment_InYear.AcademicYearID = vEngMatEnrolment.AcademicYearID AND EngMat_Enrolment_InYear.StudentRef = vEngMatEnrolment.StudentRef AND EngMat_Enrolment_InYear.CourseCode = vEngMatEnrolment.CourseCode) IS NULL THEN 0
		ELSE 1
	END AS IsStudentInSync,
	--
	'IMPORTED' AS RecordStatus
FROM
    EngMat_Enrolment_InYear
		INNER JOIN Course ON EngMat_Enrolment_InYear.CourseCode = Course.CourseCode AND EngMat_Enrolment_InYear.AcademicYearID = Course.AcademicYearID
			INNER JOIN OGP_Enrolment ON Course.ID = OGP_Enrolment.CourseID AND OGP_Enrolment.CourseID = OGP_Enrolment.OriginalCourseID  AND EngMat_Enrolment_InYear.StudentRef = OGP_Enrolment.StudentRef  -- added
				--INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = OGP_Enrolment.ID
				--	INNER JOIN OGP_Group ON OGP_Group.ID = OGP_GroupEnrolment.OGP_GroupID AND OGP_Group.OGP_TypeCode = @EngMatType 
				INNER JOIN OGP_Group ON (OGP_Group.OGP_GroupCode = EngMat_Enrolment_InYear.TeachingGroupCode AND 
				                         OGP_Group.OGP_TypeCode = @EngMatType AND 
										 OGP_Group.CourseID = OGP_Enrolment.CourseID AND
										 OGP_Group.AcademicYearID = @AcademicYearID)
WHERE 
	EngMat_Enrolment_InYear.CollegeStructure = @SearchCode
AND 
	EngMat_Enrolment_InYear.AcademicYearID = @AcademicYearID
AND 
	OGP_Enrolment.RecordStatus = 'Imported'
AND 
	EngMat_Enrolment_InYear.EngMatType = @EngMatType

UNION --UNION EngMat_Enrolment_InYear info from Enrolments in Adhoc Teaching Groups

SELECT TOP (@MaxRecords)
    EngMat_Enrolment_InYear.ID, 
	OGP_Enrolment.ID AS EnrolmentID, 
    EngMat_Enrolment_InYear.StudentRef, 
	EngMat_Enrolment_InYear.Surname, 
	EngMat_Enrolment_InYear.Forenames, 
	EngMat_Enrolment_InYear.AgeOn31Aug, 
	EngMat_Enrolment_InYear.Gender, 
	EngMat_Enrolment_InYear.Ethnicity, 
	EngMat_Enrolment_InYear.DOB,
	EngMat_Enrolment_InYear.EngMatType, /*Instead of VA_Type, We have EngMatType which is 'English' or 'Maths'*/
	EngMat_Enrolment_InYear.OutcomeDescription,
	EngMat_Enrolment_InYear.OutcomeID,
	EngMat_Enrolment_InYear.CollegeStructure,
	EngMat_Enrolment_InYear.CurrentYear,
	EngMat_Enrolment_InYear.StartDate, 
	EngMat_Enrolment_InYear.PlannedEndDate, 
	EngMat_Enrolment_InYear.ActualEndDate, 
	EngMat_Enrolment_InYear.PriorAttainment_KS4,
	EngMat_Enrolment_InYear.StartQOE_HighestGrade,
	EngMat_Enrolment_InYear.StartQOE_HighestQualType,
	EngMat_Enrolment_InYear.StartInfo,
	EngMat_Enrolment_InYear.WDNumDaysAfterStart,
	EngMat_Enrolment_InYear.CappedPoints, 
	EngMat_Enrolment_InYear.Approved,
	--EngMat_Enrolment_InYear.Size, n/a
	--EngMat_Enrolment_InYear.Duration,  n/a
	--EngMat_Enrolment_InYear.Cohort,  n/a
	EngMat_Enrolment_InYear.NotionalNVQLevel, /*NotionalNVQLevel replaces NVQLevel*/
    OGP_Group.OGP_GroupCode AS TeachingGroupCode, 
	OGP_Group.OGP_GroupTitle AS TeachingGroupTitle,
	OGP_Group.ID AS TeachingGroupID,
	Course.ID AS CourseID,
	EngMat_Enrolment_InYear.CourseCode, 
	EngMat_Enrolment_InYear.CourseTitle, 
	EngMat_Enrolment_InYear.LearningAimRef, 
	EngMat_Enrolment_InYear.LearningAimRefTitle AS LearningAimTitle,   /*LearningAimRefTitle instead of LearningAimTitle*/
	--EngMat_Enrolment_InYear.Qualification,  n/a
	--EngMat_Enrolment_InYear.QualificationCodeandName, n/a
	EngMat_Enrolment_InYear.MostRecentIYGrade, /* MostRecentIYGrade instead of IYMostRecentGrade*/
	 --EngMat_Enrolment_InYear.IYMostRecentGradeNo, --n/a
	 EngMat_Enrolment_InYear.MostRecentIYPoints, --added (The Points the IY Grade is equivalent to)
	--COALESCE (EngMat_Enrolment_InYear.QOEPoints_College2dp, EngMat_Enrolment_InYear.QOEPoints_GCSE_College2dp) AS QOEPoints,  Not Used
	EngMat_Enrolment_InYear.StartPoints, --added (Starting Points - i.e. QOE points)
	EngMat_Enrolment_InYear.StartPointsInfo, --added (Starting Point Info)
	EngMat_Enrolment_InYear.MaximumAvailablePoints, --added (The maximum number of points possible for this LearningAim)
	EngMat_Enrolment_InYear.MaxPotentialProgress, --added (The maximum Progress the student can make. i.e. MAxAvailablePoints - StartPoints)
	EngMat_Enrolment_InYear.TargetGrade, --added (The next grade up from the Starting Points)
	EngMat_Enrolment_InYear.TargetPoints, --added (The points that the Target Grade is worth)
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGrade,  --n/a.  We don't have a national target grade
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGradeInflated,  --n/a.  Wwe don't have an inflated national target grade
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEGrade,
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEPoints,
	EngMat_Enrolment_InYear.CompletionStatus, /*was CompletionDescription*/
	EngMat_Enrolment_InYear.CompletionID,
	EngMat_Enrolment_InYear.IYGrade1/*was Point1_Grade*/, EngMat_Enrolment_InYear.Point1_Notes, EngMat_Enrolment_InYear.IYPoints1,
	EngMat_Enrolment_InYear.IYGrade2/*was Point2_Grade*/, EngMat_Enrolment_InYear.Point2_Notes, EngMat_Enrolment_InYear.IYPoints2,
	EngMat_Enrolment_InYear.IYGrade3/*was Point3_Grade*/, EngMat_Enrolment_InYear.Point3_Notes, EngMat_Enrolment_InYear.IYPoints3,
	EngMat_Enrolment_InYear.IYGrade4/*was Point4_Grade*/, EngMat_Enrolment_InYear.Point4_Notes, EngMat_Enrolment_InYear.IYPoints4,
	EngMat_Enrolment_InYear.IYGrade5/*was Point5_Grade*/, EngMat_Enrolment_InYear.Point5_Notes, EngMat_Enrolment_InYear.IYPoints5,
	EngMat_Enrolment_InYear.IYGrade6/*was Point6_Grade*/, EngMat_Enrolment_InYear.Point6_Notes, EngMat_Enrolment_InYear.IYPoints6,
	EngMat_Enrolment_InYear.IYGrade7/*was Point7_Grade*/, EngMat_Enrolment_InYear.Point7_Notes, EngMat_Enrolment_InYear.IYPoints7,
	EngMat_Enrolment_InYear.IYGrade8/*was Point8_Grade*/, EngMat_Enrolment_InYear.Point8_Notes, EngMat_Enrolment_InYear.IYPoints8,
	EngMat_Enrolment_InYear.IYGrade9/*was Point9_Grade*/, EngMat_Enrolment_InYear.Point9_Notes, EngMat_Enrolment_InYear.IYPoints9,
	EngMat_Enrolment_InYear.IYGrade10/*was Point10_Grade*/, EngMat_Enrolment_InYear.Point10_Notes, EngMat_Enrolment_InYear.IYPoints10,
	EngMat_Enrolment_InYear.IYGrade11/*was Point11_Grade*/, EngMat_Enrolment_InYear.Point11_Notes, EngMat_Enrolment_InYear.IYPoints11,
	EngMat_Enrolment_InYear.IYGrade12/*was Point12_Grade*/, EngMat_Enrolment_InYear.Point12_Notes, EngMat_Enrolment_InYear.IYPoints12,
	EngMat_Enrolment_InYear.Point1_EffortDescription, 
	EngMat_Enrolment_InYear.Point2_EffortDescription, 
	EngMat_Enrolment_InYear.Point3_EffortDescription, 
	EngMat_Enrolment_InYear.Point4_EffortDescription, 
	EngMat_Enrolment_InYear.Point5_EffortDescription, 
	EngMat_Enrolment_InYear.Point6_EffortDescription, 
	EngMat_Enrolment_InYear.Point7_EffortDescription, 
	EngMat_Enrolment_InYear.Point8_EffortDescription, 
	EngMat_Enrolment_InYear.Point9_EffortDescription, 
	EngMat_Enrolment_InYear.Point10_EffortDescription, 
	EngMat_Enrolment_InYear.Point11_EffortDescription, 
	EngMat_Enrolment_InYear.Point12_EffortDescription, 
	EngMat_Enrolment_InYear.PersonalTargetGrade,
	EngMat_Enrolment_InYear.EnrolmentGrade,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget2dp AS InYearValueAdded,
	EngMat_Enrolment_InYear.IYProgressMostRecent,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget_NationalBanding AS InYearValueAdddedvsNat, --n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent2dp AS FinalValueAdded,--n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent_NationalBanding AS FinalValueAddedvsNat,--n/a
	EngMat_Enrolment_InYear.Progress, /*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points*/
	EngMat_Enrolment_InYear.CappedProgress, /*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points, but if negative, it can only be -1*/
	--dbo.fn_WebPlusDetermineOriginOfQOEForOGPlus(EstActVA.ID) AS OriginOfQOEText, --n/a
	--dbo.fn_WebPlusGetInyearValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, IYMostRecentGrade, IYMostRecentPoints, MostRecentCollegeEstPoints2dp, IYMostRecent_vs_RecentTarget2dp) AS InyearValueAddedPopupInfo,--n/a
	--dbo.fn_WebPlusGetFinalValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, EnrolmentGrade, EnrolmentPoints, MostRecentCollegeEstPoints2dp, EnrolmentGradeVAScore_vs_MostRecent2dp) AS FinalValueAddedPopupInfo--n/a
    --
    --v1.40.1 Cumulative fields added
	EngMat_Enrolment_InYear.CumulativeStartPoints,  
	EngMat_Enrolment_InYear.CumulativeProgress,
	EngMat_Enrolment_InYear.CumulativeCappedProgress,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestGrade,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestQualType,
	EngMat_Enrolment_InYear.CumulativeStartInfo,
	EngMat_Enrolment_InYear.CumulativeMaxPotentialProgress,
	EngMat_Enrolment_InYear.CumulativeTargetGrade,
	EngMat_Enrolment_InYear.CumulativeTargetPoints,
	EngMat_Enrolment_InYear.CumulativeIYProgressMostRecent,
	EngMat_Enrolment_InYear.CumulativeIYProgress1,
	EngMat_Enrolment_InYear.CumulativeIYProgress2,
	EngMat_Enrolment_InYear.CumulativeIYProgress3,
	EngMat_Enrolment_InYear.CumulativeIYProgress4,
	EngMat_Enrolment_InYear.CumulativeIYProgress5,
	EngMat_Enrolment_InYear.CumulativeIYProgress6,
	EngMat_Enrolment_InYear.CumulativeIYProgress7,
	EngMat_Enrolment_InYear.CumulativeIYProgress8,
	EngMat_Enrolment_InYear.CumulativeIYProgress9,
	EngMat_Enrolment_InYear.CumulativeIYProgress10,
	EngMat_Enrolment_InYear.CumulativeIYProgress11,
	EngMat_Enrolment_InYear.CumulativeIYProgress12,
	CASE
		WHEN (SELECT vEngMatEnrolment.ID FROM vEngMatEnrolment WHERE EngMat_Enrolment_InYear.ID = vEngMatEnrolment.ID AND EngMat_Enrolment_InYear.AcademicYearID = vEngMatEnrolment.AcademicYearID AND EngMat_Enrolment_InYear.StudentRef = vEngMatEnrolment.StudentRef AND EngMat_Enrolment_InYear.CourseCode = vEngMatEnrolment.CourseCode) IS NULL THEN 0
		ELSE 1
	END AS IsStudentInSync,
	--
	'ADHOC' AS RecordStatus
FROM
	EngMat_Enrolment_InYear
		INNER JOIN Course ON EngMat_Enrolment_InYear.CourseCode = Course.CourseCode AND EngMat_Enrolment_InYear.AcademicYearID = Course.AcademicYearID
			INNER JOIN OGP_Enrolment ON Course.ID = OGP_Enrolment.OriginalCourseID AND EngMat_Enrolment_InYear.StudentRef = OGP_Enrolment.StudentRef  --Link to OriginalCourseID because we want the Original VA (values, LAim, Course)
				INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = OGP_Enrolment.ID
					INNER JOIN OGP_Group ON OGP_Group.ID = OGP_GroupEnrolment.OGP_GroupID AND OGP_Group.OGP_TypeCode = @EngMatType 
WHERE
	EngMat_Enrolment_InYear.CollegeStructure = @SearchCode
AND 
	EngMat_Enrolment_InYear.AcademicYearID = @AcademicYearID
AND 
	OGP_Group.RecordStatus = 'Adhoc'
AND 
	OGP_GroupEnrolment.RecordStatus = 'Adhoc'
AND 
	EngMat_Enrolment_InYear.EngMatType = @EngMatType
) union_query
ORDER BY 
	4,5,3   -- Surname,Forename,StudentRef

END


--******************************************************************************************
--                        S T U D E N T  - only 1 row
--******************************************************************************************
IF @SearchType = 'STUDENT'
BEGIN
SELECT
    EngMat_Enrolment_InYear.ID, 
	OGP_Enrolment.ID AS EnrolmentID, 
    EngMat_Enrolment_InYear.StudentRef, 
	EngMat_Enrolment_InYear.Surname, 
	EngMat_Enrolment_InYear.Forenames, 
	EngMat_Enrolment_InYear.AgeOn31Aug, 
	EngMat_Enrolment_InYear.Gender, 
	EngMat_Enrolment_InYear.Ethnicity, 
	EngMat_Enrolment_InYear.DOB,
	EngMat_Enrolment_InYear.EngMatType, /*Instead of VA_Type, We have EngMatType which is 'English' or 'Maths'*/
	EngMat_Enrolment_InYear.OutcomeDescription,
	EngMat_Enrolment_InYear.OutcomeID,
	EngMat_Enrolment_InYear.CollegeStructure,
	EngMat_Enrolment_InYear.CurrentYear,
	EngMat_Enrolment_InYear.StartDate, 
	EngMat_Enrolment_InYear.PlannedEndDate, 
	EngMat_Enrolment_InYear.ActualEndDate, 
	EngMat_Enrolment_InYear.PriorAttainment_KS4,
	EngMat_Enrolment_InYear.StartQOE_HighestGrade,
	EngMat_Enrolment_InYear.StartQOE_HighestQualType,
	EngMat_Enrolment_InYear.StartInfo,
	EngMat_Enrolment_InYear.WDNumDaysAfterStart,
	EngMat_Enrolment_InYear.CappedPoints, 
	EngMat_Enrolment_InYear.Approved,
	--EngMat_Enrolment_InYear.Size, n/a
	--EngMat_Enrolment_InYear.Duration,  n/a
	--EngMat_Enrolment_InYear.Cohort,  n/a
	EngMat_Enrolment_InYear.NotionalNVQLevel, /*NotionalNVQLevel replaces NVQLevel*/
    EngMat_Enrolment_InYear.TeachingGroupCode, 
	EngMat_Enrolment_InYear.TeachingGroupTitle,
	OGP_Group.ID AS TeachingGroupID,
	Course.ID AS CourseID,
	EngMat_Enrolment_InYear.CourseCode, 
	EngMat_Enrolment_InYear.CourseTitle, 
	EngMat_Enrolment_InYear.LearningAimRef, 
	EngMat_Enrolment_InYear.LearningAimRefTitle AS LearningAimTitle,  /*LearningAimRefTitle instead of LearningAimTitle*/
	--EngMat_Enrolment_InYear.Qualification,  n/a
	--EngMat_Enrolment_InYear.QualificationCodeandName, n/a
	EngMat_Enrolment_InYear.MostRecentIYGrade, /* MostRecentIYGrade instead of IYMostRecentGrade*/
	 --EngMat_Enrolment_InYear.IYMostRecentGradeNo, --n/a
	 EngMat_Enrolment_InYear.MostRecentIYPoints, --added (The Points the IY Grade is equivalent to)
	--COALESCE (EngMat_Enrolment_InYear.QOEPoints_College2dp, EngMat_Enrolment_InYear.QOEPoints_GCSE_College2dp) AS QOEPoints,  Not Used
	EngMat_Enrolment_InYear.StartPoints, --added (Starting Points - i.e. QOE points)
	EngMat_Enrolment_InYear.StartPointsInfo, --added (Starting Point Info)
	EngMat_Enrolment_InYear.MaximumAvailablePoints, --added (The maximum number of points possible for this LearningAim)
	EngMat_Enrolment_InYear.MaxPotentialProgress, --added (The maximum Progress the student can make. i.e. MAxAvailablePoints - StartPoints)
	EngMat_Enrolment_InYear.TargetGrade, --added (The next grade up from the Starting Points)
	EngMat_Enrolment_InYear.TargetPoints, --added (The points that the Target Grade is worth)
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGrade,  --n/a.  We don't have a national target grade
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGradeInflated,  --n/a.  Wwe don't have an inflated national target grade
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEGrade,
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEPoints,
	EngMat_Enrolment_InYear.CompletionStatus AS CompletionDescription, /*was CompletionDescription*/
	EngMat_Enrolment_InYear.CompletionID,
	EngMat_Enrolment_InYear.IYGrade1/*was Point1_Grade*/, EngMat_Enrolment_InYear.Point1_Notes, EngMat_Enrolment_InYear.IYPoints1,
	EngMat_Enrolment_InYear.IYGrade2/*was Point2_Grade*/, EngMat_Enrolment_InYear.Point2_Notes, EngMat_Enrolment_InYear.IYPoints2,
	EngMat_Enrolment_InYear.IYGrade3/*was Point3_Grade*/, EngMat_Enrolment_InYear.Point3_Notes, EngMat_Enrolment_InYear.IYPoints3, 
	EngMat_Enrolment_InYear.IYGrade4/*was Point4_Grade*/, EngMat_Enrolment_InYear.Point4_Notes, EngMat_Enrolment_InYear.IYPoints4,
	EngMat_Enrolment_InYear.IYGrade5/*was Point5_Grade*/, EngMat_Enrolment_InYear.Point5_Notes, EngMat_Enrolment_InYear.IYPoints5,
	EngMat_Enrolment_InYear.IYGrade6/*was Point6_Grade*/, EngMat_Enrolment_InYear.Point6_Notes, EngMat_Enrolment_InYear.IYPoints6,
	EngMat_Enrolment_InYear.IYGrade7/*was Point7_Grade*/, EngMat_Enrolment_InYear.Point7_Notes, EngMat_Enrolment_InYear.IYPoints7,
	EngMat_Enrolment_InYear.IYGrade8/*was Point8_Grade*/, EngMat_Enrolment_InYear.Point8_Notes, EngMat_Enrolment_InYear.IYPoints8,
	EngMat_Enrolment_InYear.IYGrade9/*was Point9_Grade*/, EngMat_Enrolment_InYear.Point9_Notes, EngMat_Enrolment_InYear.IYPoints9,
	EngMat_Enrolment_InYear.IYGrade10/*was Point10_Grade*/, EngMat_Enrolment_InYear.Point10_Notes, EngMat_Enrolment_InYear.IYPoints10,
	EngMat_Enrolment_InYear.IYGrade11/*was Point11_Grade*/, EngMat_Enrolment_InYear.Point11_Notes, EngMat_Enrolment_InYear.IYPoints11,
	EngMat_Enrolment_InYear.IYGrade12/*was Point12_Grade*/, EngMat_Enrolment_InYear.Point12_Notes, EngMat_Enrolment_InYear.IYPoints12,
	EngMat_Enrolment_InYear.Point1_EffortDescription, 
	EngMat_Enrolment_InYear.Point2_EffortDescription, 
	EngMat_Enrolment_InYear.Point3_EffortDescription, 
	EngMat_Enrolment_InYear.Point4_EffortDescription, 
	EngMat_Enrolment_InYear.Point5_EffortDescription, 
	EngMat_Enrolment_InYear.Point6_EffortDescription, 
	EngMat_Enrolment_InYear.Point7_EffortDescription, 
	EngMat_Enrolment_InYear.Point8_EffortDescription, 
	EngMat_Enrolment_InYear.Point9_EffortDescription, 
	EngMat_Enrolment_InYear.Point10_EffortDescription, 
	EngMat_Enrolment_InYear.Point11_EffortDescription, 
	EngMat_Enrolment_InYear.Point12_EffortDescription, 
	EngMat_Enrolment_InYear.PersonalTargetGrade,
	EngMat_Enrolment_InYear.EnrolmentGrade,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget2dp AS InYearValueAdded,
	EngMat_Enrolment_InYear.IYProgressMostRecent,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget_NationalBanding AS InYearValueAdddedvsNat, --n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent2dp AS FinalValueAdded,--n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent_NationalBanding AS FinalValueAddedvsNat,--n/a
	EngMat_Enrolment_InYear.Progress,/*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points*/
	EngMat_Enrolment_InYear.CappedProgress, /*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points, but if negative, it can only be -1*/
	--dbo.fn_WebPlusDetermineOriginOfQOEForOGPlus(EstActVA.ID) AS OriginOfQOEText, --n/a
	--dbo.fn_WebPlusGetInyearValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, IYMostRecentGrade, IYMostRecentPoints, MostRecentCollegeEstPoints2dp, IYMostRecent_vs_RecentTarget2dp) AS InyearValueAddedPopupInfo,--n/a
	--dbo.fn_WebPlusGetFinalValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, EnrolmentGrade, EnrolmentPoints, MostRecentCollegeEstPoints2dp, EnrolmentGradeVAScore_vs_MostRecent2dp) AS FinalValueAddedPopupInfo--n/a
    --
    --v1.40.1 Cumulative fields added
	EngMat_Enrolment_InYear.CumulativeStartPoints,  
	EngMat_Enrolment_InYear.CumulativeProgress,
	EngMat_Enrolment_InYear.CumulativeCappedProgress,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestGrade,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestQualType,
	EngMat_Enrolment_InYear.CumulativeStartInfo,
	EngMat_Enrolment_InYear.CumulativeMaxPotentialProgress,
	EngMat_Enrolment_InYear.CumulativeTargetGrade,
	EngMat_Enrolment_InYear.CumulativeTargetPoints,
	EngMat_Enrolment_InYear.CumulativeIYProgressMostRecent,
	EngMat_Enrolment_InYear.CumulativeIYProgress1,
	EngMat_Enrolment_InYear.CumulativeIYProgress2,
	EngMat_Enrolment_InYear.CumulativeIYProgress3,
	EngMat_Enrolment_InYear.CumulativeIYProgress4,
	EngMat_Enrolment_InYear.CumulativeIYProgress5,
	EngMat_Enrolment_InYear.CumulativeIYProgress6,
	EngMat_Enrolment_InYear.CumulativeIYProgress7,
	EngMat_Enrolment_InYear.CumulativeIYProgress8,
	EngMat_Enrolment_InYear.CumulativeIYProgress9,
	EngMat_Enrolment_InYear.CumulativeIYProgress10,
	EngMat_Enrolment_InYear.CumulativeIYProgress11,
	EngMat_Enrolment_InYear.CumulativeIYProgress12,
	CASE
		WHEN (SELECT vEngMatEnrolment.ID FROM vEngMatEnrolment WHERE EngMat_Enrolment_InYear.ID = vEngMatEnrolment.ID AND EngMat_Enrolment_InYear.AcademicYearID = vEngMatEnrolment.AcademicYearID AND EngMat_Enrolment_InYear.StudentRef = vEngMatEnrolment.StudentRef AND EngMat_Enrolment_InYear.CourseCode = vEngMatEnrolment.CourseCode) IS NULL THEN 0
		ELSE 1
	END AS IsStudentInSync,
	--
	'IMPORTED' AS RecordStatus
FROM
    EngMat_Enrolment_InYear
		INNER JOIN Course ON EngMat_Enrolment_InYear.CourseCode = Course.CourseCode AND EngMat_Enrolment_InYear.AcademicYearID = Course.AcademicYearID
			INNER JOIN OGP_Enrolment ON Course.ID = OGP_Enrolment.CourseID AND OGP_Enrolment.CourseID = OGP_Enrolment.OriginalCourseID  AND EngMat_Enrolment_InYear.StudentRef = OGP_Enrolment.StudentRef  -- added
				--INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = OGP_Enrolment.ID
				--	INNER JOIN OGP_Group ON OGP_Group.ID = OGP_GroupEnrolment.OGP_GroupID AND OGP_Group.OGP_TypeCode = @EngMatType 
				INNER JOIN OGP_Group ON (OGP_Group.OGP_GroupCode = EngMat_Enrolment_InYear.TeachingGroupCode AND 
				                         OGP_Group.OGP_TypeCode = @EngMatType AND 
										 OGP_Group.CourseID = OGP_Enrolment.CourseID AND
										 OGP_Group.AcademicYearID = @AcademicYearID)
WHERE 
	(
		(EngMat_Enrolment_InYear.StudentRef = @SearchCode) 
	)
AND 
	EngMat_Enrolment_InYear.AcademicYearID = @AcademicYearID
AND 
	OGP_Enrolment.RecordStatus = 'Imported'
AND 
	EngMat_Enrolment_InYear.EngMatType = @EngMatType

UNION --UNION EngMat_Enrolment_InYear info from Enrolments in Adhoc Teaching Groups

SELECT
    EngMat_Enrolment_InYear.ID, 
	OGP_Enrolment.ID AS EnrolmentID, 
    EngMat_Enrolment_InYear.StudentRef, 
	EngMat_Enrolment_InYear.Surname, 
	EngMat_Enrolment_InYear.Forenames, 
	EngMat_Enrolment_InYear.AgeOn31Aug, 
	EngMat_Enrolment_InYear.Gender, 
	EngMat_Enrolment_InYear.Ethnicity, 
	EngMat_Enrolment_InYear.DOB,
	EngMat_Enrolment_InYear.EngMatType, /*Instead of VA_Type, We have EngMatType which is 'English' or 'Maths'*/
	EngMat_Enrolment_InYear.OutcomeDescription,
	EngMat_Enrolment_InYear.OutcomeID,
	EngMat_Enrolment_InYear.CollegeStructure,
	EngMat_Enrolment_InYear.CurrentYear,
	EngMat_Enrolment_InYear.StartDate, 
	EngMat_Enrolment_InYear.PlannedEndDate, 
	EngMat_Enrolment_InYear.ActualEndDate, 
	EngMat_Enrolment_InYear.PriorAttainment_KS4,
	EngMat_Enrolment_InYear.StartQOE_HighestGrade,
	EngMat_Enrolment_InYear.StartQOE_HighestQualType,
	EngMat_Enrolment_InYear.StartInfo,
	EngMat_Enrolment_InYear.WDNumDaysAfterStart,
	EngMat_Enrolment_InYear.CappedPoints, 
	EngMat_Enrolment_InYear.Approved,
	--EngMat_Enrolment_InYear.Size, n/a
	--EngMat_Enrolment_InYear.Duration,  n/a
	--EngMat_Enrolment_InYear.Cohort,  n/a
	EngMat_Enrolment_InYear.NotionalNVQLevel, /*NotionalNVQLevel replaces NVQLevel*/
    OGP_Group.OGP_GroupCode AS TeachingGroupCode, 
	OGP_Group.OGP_GroupTitle AS TeachingGroupTitle,
	OGP_Group.ID AS TeachingGroupID,
	Course.ID AS CourseID,
	EngMat_Enrolment_InYear.CourseCode, 
	EngMat_Enrolment_InYear.CourseTitle, 
	EngMat_Enrolment_InYear.LearningAimRef, 
	EngMat_Enrolment_InYear.LearningAimRefTitle AS LearningAimTitle,   /*LearningAimRefTitle instead of LearningAimTitle*/
	--EngMat_Enrolment_InYear.Qualification,  n/a
	--EngMat_Enrolment_InYear.QualificationCodeandName, n/a
	EngMat_Enrolment_InYear.MostRecentIYGrade, /* MostRecentIYGrade instead of IYMostRecentGrade*/
	 --EngMat_Enrolment_InYear.IYMostRecentGradeNo, --n/a
	 EngMat_Enrolment_InYear.MostRecentIYPoints, --added (The Points the IY Grade is equivalent to)
	--COALESCE (EngMat_Enrolment_InYear.QOEPoints_College2dp, EngMat_Enrolment_InYear.QOEPoints_GCSE_College2dp) AS QOEPoints,  Not Used
	EngMat_Enrolment_InYear.StartPoints, --added (Starting Points - i.e. QOE points)
	EngMat_Enrolment_InYear.StartPointsInfo, --added (Starting Point Info)
	EngMat_Enrolment_InYear.MaximumAvailablePoints, --added (The maximum number of points possible for this LearningAim)
	EngMat_Enrolment_InYear.MaxPotentialProgress, --added (The maximum Progress the student can make. i.e. MAxAvailablePoints - StartPoints)
	EngMat_Enrolment_InYear.TargetGrade, --added (The next grade up from the Starting Points)
	EngMat_Enrolment_InYear.TargetPoints, --added (The points that the Target Grade is worth)
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGrade,  --n/a.  We don't have a national target grade
	--EngMat_Enrolment_InYear.MostRecentCollegeEstGradeInflated,  --n/a.  Wwe don't have an inflated national target grade
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEGrade,
	EngMat_Enrolment_InYear.OGHighestPreviousGCSEPoints,
	EngMat_Enrolment_InYear.CompletionStatus, /*was CompletionDescription*/
	EngMat_Enrolment_InYear.CompletionID,
	EngMat_Enrolment_InYear.IYGrade1/*was Point1_Grade*/, EngMat_Enrolment_InYear.Point1_Notes, EngMat_Enrolment_InYear.IYPoints1,
	EngMat_Enrolment_InYear.IYGrade2/*was Point2_Grade*/, EngMat_Enrolment_InYear.Point2_Notes, EngMat_Enrolment_InYear.IYPoints2,
	EngMat_Enrolment_InYear.IYGrade3/*was Point3_Grade*/, EngMat_Enrolment_InYear.Point3_Notes, EngMat_Enrolment_InYear.IYPoints3,
	EngMat_Enrolment_InYear.IYGrade4/*was Point4_Grade*/, EngMat_Enrolment_InYear.Point4_Notes, EngMat_Enrolment_InYear.IYPoints4,
	EngMat_Enrolment_InYear.IYGrade5/*was Point5_Grade*/, EngMat_Enrolment_InYear.Point5_Notes, EngMat_Enrolment_InYear.IYPoints5,
	EngMat_Enrolment_InYear.IYGrade6/*was Point6_Grade*/, EngMat_Enrolment_InYear.Point6_Notes, EngMat_Enrolment_InYear.IYPoints6,
	EngMat_Enrolment_InYear.IYGrade7/*was Point7_Grade*/, EngMat_Enrolment_InYear.Point7_Notes, EngMat_Enrolment_InYear.IYPoints7,
	EngMat_Enrolment_InYear.IYGrade8/*was Point8_Grade*/, EngMat_Enrolment_InYear.Point8_Notes, EngMat_Enrolment_InYear.IYPoints8,
	EngMat_Enrolment_InYear.IYGrade9/*was Point9_Grade*/, EngMat_Enrolment_InYear.Point9_Notes, EngMat_Enrolment_InYear.IYPoints9,
	EngMat_Enrolment_InYear.IYGrade10/*was Point10_Grade*/, EngMat_Enrolment_InYear.Point10_Notes, EngMat_Enrolment_InYear.IYPoints10,
	EngMat_Enrolment_InYear.IYGrade11/*was Point11_Grade*/, EngMat_Enrolment_InYear.Point11_Notes, EngMat_Enrolment_InYear.IYPoints11,
	EngMat_Enrolment_InYear.IYGrade12/*was Point12_Grade*/, EngMat_Enrolment_InYear.Point12_Notes, EngMat_Enrolment_InYear.IYPoints12,
	EngMat_Enrolment_InYear.Point1_EffortDescription, 
	EngMat_Enrolment_InYear.Point2_EffortDescription, 
	EngMat_Enrolment_InYear.Point3_EffortDescription, 
	EngMat_Enrolment_InYear.Point4_EffortDescription, 
	EngMat_Enrolment_InYear.Point5_EffortDescription, 
	EngMat_Enrolment_InYear.Point6_EffortDescription, 
	EngMat_Enrolment_InYear.Point7_EffortDescription, 
	EngMat_Enrolment_InYear.Point8_EffortDescription, 
	EngMat_Enrolment_InYear.Point9_EffortDescription, 
	EngMat_Enrolment_InYear.Point10_EffortDescription, 
	EngMat_Enrolment_InYear.Point11_EffortDescription, 
	EngMat_Enrolment_InYear.Point12_EffortDescription, 
	EngMat_Enrolment_InYear.PersonalTargetGrade,
	EngMat_Enrolment_InYear.EnrolmentGrade,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget2dp AS InYearValueAdded,
	EngMat_Enrolment_InYear.IYProgressMostRecent,
	--EngMat_Enrolment_InYear.IYMostRecent_vs_RecentTarget_NationalBanding AS InYearValueAdddedvsNat, --n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent2dp AS FinalValueAdded,--n/a
	--EngMat_Enrolment_InYear.EnrolmentGradeVAScore_vs_MostRecent_NationalBanding AS FinalValueAddedvsNat,--n/a
	EngMat_Enrolment_InYear.Progress, /*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points*/
	EngMat_Enrolment_InYear.CappedProgress, /*This is the equivalent to the Value Added Score - it is the difference between Start Points and Final Points, but if negative, it can only be -1*/
	--dbo.fn_WebPlusDetermineOriginOfQOEForOGPlus(EstActVA.ID) AS OriginOfQOEText, --n/a
	--dbo.fn_WebPlusGetInyearValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, IYMostRecentGrade, IYMostRecentPoints, MostRecentCollegeEstPoints2dp, IYMostRecent_vs_RecentTarget2dp) AS InyearValueAddedPopupInfo,--n/a
	--dbo.fn_WebPlusGetFinalValueAddedPopupInfo(VA_Type, Cohort, LearningAimRef, LearningAimTitle, Size, MostRecentNationalDataYear, MostRecentCollegeEstGrade, EnrolmentGrade, EnrolmentPoints, MostRecentCollegeEstPoints2dp, EnrolmentGradeVAScore_vs_MostRecent2dp) AS FinalValueAddedPopupInfo--n/a
    --
    --v1.40.1 Cumulative fields added
    EngMat_Enrolment_InYear.CumulativeStartPoints,  
	EngMat_Enrolment_InYear.CumulativeProgress,
	EngMat_Enrolment_InYear.CumulativeCappedProgress,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestGrade,
	EngMat_Enrolment_InYear.CumulativeStartQOE_HighestQualType,
	EngMat_Enrolment_InYear.CumulativeStartInfo,
	EngMat_Enrolment_InYear.CumulativeMaxPotentialProgress,
	EngMat_Enrolment_InYear.CumulativeTargetGrade,
	EngMat_Enrolment_InYear.CumulativeTargetPoints,
	EngMat_Enrolment_InYear.CumulativeIYProgressMostRecent,
	EngMat_Enrolment_InYear.CumulativeIYProgress1,
	EngMat_Enrolment_InYear.CumulativeIYProgress2,
	EngMat_Enrolment_InYear.CumulativeIYProgress3,
	EngMat_Enrolment_InYear.CumulativeIYProgress4,
	EngMat_Enrolment_InYear.CumulativeIYProgress5,
	EngMat_Enrolment_InYear.CumulativeIYProgress6,
	EngMat_Enrolment_InYear.CumulativeIYProgress7,
	EngMat_Enrolment_InYear.CumulativeIYProgress8,
	EngMat_Enrolment_InYear.CumulativeIYProgress9,
	EngMat_Enrolment_InYear.CumulativeIYProgress10,
	EngMat_Enrolment_InYear.CumulativeIYProgress11,
	EngMat_Enrolment_InYear.CumulativeIYProgress12,
	CASE
		WHEN (SELECT vEngMatEnrolment.ID FROM vEngMatEnrolment WHERE EngMat_Enrolment_InYear.ID = vEngMatEnrolment.ID AND EngMat_Enrolment_InYear.AcademicYearID = vEngMatEnrolment.AcademicYearID AND EngMat_Enrolment_InYear.StudentRef = vEngMatEnrolment.StudentRef AND EngMat_Enrolment_InYear.CourseCode = vEngMatEnrolment.CourseCode) IS NULL THEN 0
		ELSE 1
	END AS IsStudentInSync,
	--
	'ADHOC' AS RecordStatus
FROM
	EngMat_Enrolment_InYear
		INNER JOIN Course ON EngMat_Enrolment_InYear.CourseCode = Course.CourseCode AND EngMat_Enrolment_InYear.AcademicYearID = Course.AcademicYearID
			INNER JOIN OGP_Enrolment ON Course.ID = OGP_Enrolment.OriginalCourseID AND EngMat_Enrolment_InYear.StudentRef = OGP_Enrolment.StudentRef  --Link to OriginalCourseID because we want the Original VA (values, LAim, Course)
				INNER JOIN OGP_GroupEnrolment ON OGP_GroupEnrolment.OGP_EnrolmentID = OGP_Enrolment.ID
					INNER JOIN OGP_Group ON OGP_Group.ID = OGP_GroupEnrolment.OGP_GroupID AND OGP_Group.OGP_TypeCode = @EngMatType 
WHERE
	(
		(EngMat_Enrolment_InYear.StudentRef = @SearchCode) 
	)
    AND EngMat_Enrolment_InYear.AcademicYearID = @AcademicYearID
      --For now, all records in these 3 tables will be adhoc and created by manual data entry through OneGrade Plus
	AND OGP_Group.RecordStatus = 'Adhoc'
	AND OGP_GroupEnrolment.RecordStatus = 'Adhoc'
--	AND OGP_Enrolment.RecordStatus = 'Adhoc'
	AND EngMat_Enrolment_InYear.EngMatType = @EngMatType

ORDER BY 
	4,5,3   -- Surname,Forename,StudentRef

END

GO




/****** Object:  StoredProcedure [dbo].[sp_WebPlus_EMStudentQuals_Select]    Script Date: 12/10/2025 19:10:04 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



ALTER PROCEDURE [dbo].[sp_WebPlus_EMStudentQuals_Select]
@AcademicYearID VARCHAR(5),
@StudentRef VARCHAR(20),
@EngMatType VARCHAR(10)

AS
-- =============================================
-- Author:		Andrew Breward
-- Create date: AndyB 11/02/2023 v1.0.0
-- Descripton:	SP to retrieve the Quals for a student
-- Modified:    12/Oct/2025 AndyB v1.40.1 Allow all years to be retrieved
-- Examples:    exec sp_WebPlus_EMStudentQuals_Select '22/23', 439050, 'English'
--              exec sp_WebPlus_EMStudentQuals_Select 'ALL', 439050, 'English'
-- =============================================

IF (@AcademicYearID = 'ALL')
BEGIN
	SELECT 
		S.ID, 
		S.AcademicYearID,
		S.EntryLearningAimRef, 
		S.LearningAimRefTitle AS Title, 
		S.Grade, 
		S.MappedGrade, 
		S.CappedPoints, 
		S.DateAwarded, 
		S.EngMatType, 
		S.NotionalNVQLevel 
	FROM 
		vEngMatStudentEntryLearningAim S 
	WHERE 
		S.StudentRef     = @StudentRef AND 
		S.EngMatType     = @EngMatType
	ORDER BY 
	    S.AcademicYearID DESC,
		S.EntryLearningAimRef;

END
ELSE
BEGIN
	SELECT 
		S.ID, 
		S.AcademicYearID,
		S.EntryLearningAimRef, 
		S.LearningAimRefTitle AS Title, 
		S.Grade, 
		S.MappedGrade, 
		S.CappedPoints, 
		S.DateAwarded, 
		S.EngMatType, 
		S.NotionalNVQLevel 
	FROM 
		vEngMatStudentEntryLearningAim S 
	WHERE 
		S.StudentRef     = @StudentRef AND 
		S.AcademicYearID = @AcademicYearID AND 
		S.EngMatType     = @EngMatType
	ORDER BY 
		S.EntryLearningAimRef;

END

GO
